13

是否可以为用户输入设置计时器?等待 10 秒 - 进行下一个操作等。我的意思是例如

 //wait several seconds{
 String s = new BufferedReader(new InputStreamReader(System.in)).readLine();
 //wait server seconds}
 //next operation and etc.
4

3 回答 3

17

比本杰明考克斯的回答稍微简单一点的方法是做类似的事情

int x = 2; // wait 2 seconds at most

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
long startTime = System.currentTimeMillis();
while ((System.currentTimeMillis() - startTime) < x * 1000
        && !in.ready()) {
}

if (in.ready()) {
    System.out.println("You entered: " + in.readLine());
} else {
    System.out.println("You did not enter data");
}

然而,这将比他的解决方案消耗更多的资源。

于 2012-04-07T23:57:37.100 回答
6

不是开箱即用的,不。通常,Reader 仅在另一个线程关闭底层流或到达输入末尾时才中断 read() 调用。

由于 read() 并不是那么可中断的,这就变成了一个并发编程问题。知道超时的线程需要能够中断试图读取输入的线程。

本质上,读取线程将不得不轮询 Reader 的 ready() 方法,而不是在没有可读取的内容时锁定在 read() 中。如果您将此轮询和等待操作包装在 java.util.concurrent.Future 中,那么您会在超时的情况下调用 Future 的 get() 方法。

本文详细介绍: http ://www.javaspecialists.eu/archive/Issue153.html

于 2012-04-07T23:20:01.110 回答
0
 BufferedReader inputInt = new BufferedReader(new InputStreamReader(System.in));
 Robot enterKey = new Robot();
 TimerTask task = new TimerTask() {
   public void run() {
                      enterKey.keyPress(KeyEvent.VK_ENTER);
                     }
 };

 Timer timer = new Timer();
 timer.schedule(task, 30 * 1000);
 userInputanswer = inputInt.read();
 timer.cancel();
于 2019-10-06T18:28:45.570 回答