3.5秒后如何停止和跳过命令?

时间:2019-09-02 21:16:58

标签: java loops timer

我想在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;
    }

1 个答案:

答案 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中的超时时间。