是否可以为用户输入设置计时器?等待10秒钟 - 下一操作等 我的意思是比如用户输入设置超时
//wait several seconds{
String s = new BufferedReader(new InputStreamReader(System.in)).readLine();
//wait server seconds}
//next operation and etc.
是否可以为用户输入设置计时器?等待10秒钟 - 下一操作等 我的意思是比如用户输入设置超时
//wait several seconds{
String s = new BufferedReader(new InputStreamReader(System.in)).readLine();
//wait server seconds}
//next operation and etc.
不开箱的,没有。通常,只有当另一个线程关闭底层流时,Reader才会跳出read()调用,或者您到达输入的末尾。
由于read()并非都是可以中断的,所以这成为一个并发编程问题。知道超时的线程需要能够中断试图读取输入的线程。
从本质上讲,阅读线程将不得不轮询阅读器的ready()方法,而不是在没有任何内容需要读取时锁定在read()中。如果你在java.util.concurrent.Future中封装这个轮询和等待操作,那么你可以使用timeout来调用Future的get()方法。
本文进入一些细节:http://www.javaspecialists.eu/archive/Issue153.html
稍微更简单的方式来做到这一点比本杰明·考克斯的答案会是做这样的事情
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");
}
然而这将消耗更多的资源比他的解决方案。
如果有任何字节可用,BufferedReader.ready()似乎返回true,不一定包含换行符。考虑有一个角色在等待而没有结尾的新行的情况。 in.ready()返回true,调用in.readLine(),但会无限期地等待换行符。 – pendor 2014-02-19 15:14:57
@pendor但是只有当用户输入提供换行符序列的命令行时,标准的'System.in'才会有数据。 – Jeffrey 2014-02-19 19:03:02
@Jeffrey是否在任何地方记录? – Max 2016-03-05 17:32:10