2012-04-07 63 views
6

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

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

回答

4

不开箱的,没有。通常,只有当另一个线程关闭底层流时,Reader才会跳出read()调用,或者您到达输入的末尾。

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

从本质上讲,阅读线程将不得不轮询阅读器的ready()方法,而不是在没有任何内容需要读取时锁定在read()中。如果你在java.util.concurrent.Future中封装这个轮询和等待操作,那么你可以使用timeout来调用Future的get()方法。

本文进入一些细节:http://www.javaspecialists.eu/archive/Issue153.html

12

稍微更简单的方式来做到这一点比本杰明·考克斯的答案会是做这样的事情

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"); 
} 

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

+2

如果有任何字节可用,BufferedReader.ready()似乎返回true,不一定包含换行符。考虑有一个角色在等待而没有结尾的新行的情况。 in.ready()返回true,调用in.readLine(),但会无限期地等待换行符。 – pendor 2014-02-19 15:14:57

+1

@pendor但是只有当用户输入提供换行符序列的命令行时,标准的'System.in'才会有数据。 – Jeffrey 2014-02-19 19:03:02

+1

@Jeffrey是否在任何地方记录? – Max 2016-03-05 17:32:10