我想在3.5秒后等待输入时停止并跳过该命令。我尝试通过从开始时间中减去来使用System.currentTimeMillis()
,但是我编写的代码不会跳过输入。
food是表类中的arrayList。
public void timer() {
startTime = System.currentTimeMillis();
while(false||(System.currentTimeMillis()-startTime)<3500)
{
correct = input(); //What I want to skip after 3.5 seconds
}
record();
}
这是input()
方法:
public boolean input()
{
Scanner console = new Scanner (System.in);
//I want to skip everything after this after 3.5 seconds.
int num = console.nextInt();
num--;
System.out.println("You selected " + table.food.get(num).toString());
table.food.remove(num);
if (num==choice)
{
return true;
}
return false;
}
答案 0 :(得分:2)
您面临的问题之一是,从控制台读取时,Scanner
的{{1}}方法中的任何一个都不能被中断。因此,您必须以其他方式读取输入,例如,使用next
。
此后,您可以向ExecutorService
提交特定任务,该任务与InputStreamReader
分开处理“输入读取”的执行。您将获得一个Future
,可以在上面定义超时。
请注意,此操作仍在两个线程上都处于阻塞状态。
此解决方案多少基于此article
。
main Thread
请注意,import java.io.*;
import java.util.concurrent.*;
public class Test {
static class ReadInput implements Callable<Integer> {
public Integer call() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
try {
while (br.ready() == false) {
Thread.sleep(250);
}
String input = br.readLine();
return Integer.parseInt(input);
} catch (InterruptedException e) {
return null;
}
}
}
public static void main(String[] args) {
Integer input = null;
ExecutorService ex = Executors.newSingleThreadExecutor();
try {
Future<Integer> future = ex.submit(new ReadInput());
input = future.get(3500, TimeUnit.MILLISECONDS);
} catch (ExecutionException | InterruptedException | TimeoutException e) {
// handle exceptions that need to be handeled
} finally {
ex.shutdownNow();
}
System.out.println("done: " + input);
}
}
中的超时时间应低于ReadInput
中的超时时间。