设置用户输入的超时

时间:2012-04-07 23:01:39

标签: java

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

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

3 个答案:

答案 0 :(得分:13)

比Benjamin Cox的回答更简单的方法是做一些像

这样的事情
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");
}
然而,这将比他的解决方案消耗更多的资源。

答案 1 :(得分:6)

不是开箱即用,没有。通常,只有当另一个线程关闭基础流,或者到达输入的末尾时,Reader才会中断read()调用。

由于read()不是所有可中断的,因此这成为一个并发编程问题。知道超时的线程需要能够中断尝试读取输入的线程。

本质上,读取线程必须轮询Reader的ready()方法,而不是在没有任何内容可读时锁定read()。如果在java.util.concurrent.Future中包装此轮询和等待操作,则使用超时调用Future的get()方法。

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

答案 2 :(得分: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();