gpt4 book ai didi

java - 没有 System.exit 的有效 Java 输入的时间限制

转载 作者:搜寻专家 更新时间:2023-11-01 03:16:22 25 4
gpt4 key购买 nike

我有一个问题,如何实现此处发现的变体:

Set Time Limit on User Input (Scanner) Java

在我的例子中,如果在保持程序运行的同时达到时间限制,我想忽略输入。

String str = "";
TimerTask task = new TimerTask(){
public void run(){
if(str.equals("")){
System.out.println("No Valid Input detected");
//TimerTask should end here along with the Input
//Other example has System.exit which will also terminate the
//entire program
}else {
// still keep the program alive. The condition itself isn't
//important.
}
}

Timer timer = new Timer();
timer.schedule(task, 10*1000);
Scanner scanner = new Scanner(System.in);

do{
System.out.println("Type a message");
str = scanner.nextLine();
}while(!str.equals("hello"));

timer.cancel();

REACHED HERE!

如果输入在 10 秒内给出(并且有效),则循环结束并取消任务,这是完美的。但是,如果输入无效并且计时器结束,我希望它停止请求输入并跳到“REACHED HERE”位置。这可能吗?

最佳答案

正如@Sedrick 提到的,最简单的解决方案是第二个线程。问题是从 System.in 读取是阻塞的。很明显,您链接到的示例使用 System.exit() 解决了该问题,但这对您的情况来说太极端了。

另一种方法可能是使用 Deque(双端队列)来中继输入,并设置超时:

BlockingDeque<String> deque = new LinkedBlockingDeque<>();

new Thread(() -> {
Scanner scanner = new Scanner(System.in);
String input;
do {
System.out.println("Type a message");
input = scanner.nextLine();
deque.add(input);
} while (!input.equals("hello"));
}).start();

String str;
do {
str = deque.poll(10, TimeUnit.SECONDS);
} while (str != null && !str.equals("hello"));

System.out.println("REACHED HERE!");

扩展答案...

上面的想法是只创建线程一次,并重新使用 deque 作为 System.in 的代理。但是,在线程中,从 System.in 读取将始终阻塞 - 没有干净的方法来中断线程,缺少 System.exit()

不过,这可以稍微改进一下。首先,如果线程被标记为守护线程,这仍然允许 JVM 在它周围关闭。例如。如果 main() 方法完成,JVM 也会干净地退出:

Thread thread = new Thread(() -> {
...
});
thread.setDaemon(true);
thread.start();

但是,通过使用 InputStream.available(),可以轮询等待输入。这样就可以干净地中断线程:

BlockingDeque<String> deque = new LinkedBlockingDeque<>();

Thread thread = new Thread(() -> {
Scanner scanner = new Scanner(System.in);
String input;
try {
do {
if (System.in.available() > 0) {
input = scanner.nextLine();
deque.add(input);
} else
try {
Thread.sleep(50);
} catch (InterruptedException ex) {
System.err.println("Thread stopped");
break;
}
} while (true);
} catch (IOException ex) {
ex.printStackTrace();
}
});
thread.start();

System.out.println("Type a message");
String str;
do {
str = deque.poll(10, TimeUnit.SECONDS);
} while (str != null && !str.equals("hello"));

System.out.println("REACHED HERE!");

thread.interrupt();

用户在没有换行的情况下键入几个字母似乎存在一些风险。目前它仍然会挂起,但这并没有发生在 Windows 上 - 显然来自命令窗口的数据只会逐行释放到 System.in

关于java - 没有 System.exit 的有效 Java 输入的时间限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49578598/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com