在单个线程中中断睡眠

时间:2014-06-14 21:14:49

标签: java time timer sleep

我想在Java中实现代码中的停止点,这样除非用户按Enter键,否则不会在20秒内完成任何操作。 目前我正在使用:

sleep(20000);

我知道一个线程可以被另一个使用wait()notify()的线程“唤醒”,但我想知道是否存在不需要抛出新线程的东西。理想情况下,我希望能够通过键盘为InputStream上的读取操作添加超时,以便我可以执行以下操作:

try {
  //Here is where the waiting happens
  myStream.read();
} catch (TimeoutException e) { }
//... Continue normally

3 个答案:

答案 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执行超时计算,但这首先涉及并发编程。