是否可以为用户输入设置计时器?等待 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.
比本杰明考克斯的回答稍微简单一点的方法是做类似的事情
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");
}
然而,这将比他的解决方案消耗更多的资源。
不是开箱即用的,不。通常,Reader 仅在另一个线程关闭底层流或到达输入末尾时才中断 read() 调用。
由于 read() 并不是那么可中断的,这就变成了一个并发编程问题。知道超时的线程需要能够中断试图读取输入的线程。
本质上,读取线程将不得不轮询 Reader 的 ready() 方法,而不是在没有可读取的内容时锁定在 read() 中。如果您将此轮询和等待操作包装在 java.util.concurrent.Future 中,那么您会在超时的情况下调用 Future 的 get() 方法。
本文详细介绍: http ://www.javaspecialists.eu/archive/Issue153.html
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();