我想在Java中实现代码中的停止点,这样除非用户按Enter键,否则不会在20秒内完成任何操作。 目前我正在使用:
sleep(20000);
我知道一个线程可以被另一个使用wait()
和notify()
的线程“唤醒”,但我想知道是否存在不需要抛出新线程的东西。理想情况下,我希望能够通过键盘为InputStream上的读取操作添加超时,以便我可以执行以下操作:
try {
//Here is where the waiting happens
myStream.read();
} catch (TimeoutException e) { }
//... Continue normally
答案 0 :(得分:2)
您可以代替睡眠20秒,而不是每隔1秒钟睡一觉并轮询以查看用户是否输入了任何内容:
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
for (int i = 0; i < 20; i++) {
try {
sleep(1000);
if (in.ready()) {
break;
} else {
System.out.println(i+" seeconds have passed");
}
} catch (InterruptedException | IOException ex) {
}
}
答案 1 :(得分:1)
评论是正确的,但建议(有点hacky)解决方法:
BufferedReader myStream = new BufferedReader(new InputStreamReader(System.in));
long startTime = System.currentTimeMillis();
while(System.currentTimeMillis() < (startTime + 20000)) {
if (myStream.ready()) {
//do something when enter is pressed
break;
}
}
答案 2 :(得分:1)
使用一个线程无法实现具有超时中断的阻塞读取,因为来自输入流的读取无限期地阻塞。有一种方法可以使用Future执行超时计算,但这首先涉及并发编程。