带有Java超时的用户输入

问题描述 投票:0回答:2

我正在尝试使用此功能构建命令行界面:如果用户花费超过15秒钟的时间来插入输入(在这种情况下为Integer),则该功能将做出默认选择(0)。下面的代码是我到目前为止编写的,可以正常运行。

问题是,我想添加一个新功能:如果用户输入了错误的数字(<0或> range),控制台应打印类似("Wrong choice, you have to pick an integer between 0 - "+ range);的内容>

但是,在控制台打印消息的同时,计时器应该仍在运行,并在15秒后结束该循环,以防用户继续输入错误的号码。如果用户最终获得正确的号码,则应立即中断循环。

这是我的代码,但是我对如何添加功能没有明确的想法,因为我对Future,Callable和Executor功能比较陌生。如果有人对此有更多的经验,我将很高兴学习!

private int getChoiceWithTimeout(int range){
       Callable<Integer> k = () -> new Scanner(System.in).nextInt();
       Long start= System.currentTimeMillis();
       int choice=0;
       ExecutorService l = Executors.newFixedThreadPool(1);  ;
       Future<Integer> g;
       System.out.println("Enter your choice in 15 seconds :");
       g= l.submit(k);
       while(System.currentTimeMillis()-start<15*1000 && !g.isDone()){
           // Wait for future
       }
       if(g.isDone()){
           try {
               choice=g.get();
           } catch (InterruptedException | ExecutionException e) {
               e.printStackTrace();
           }
       }
       g.cancel(true);
       return choice;
    }

我正在尝试使用此功能构建命令行界面:如果用户花费超过15秒钟的时间来插入输入(在这种情况下为Integer),则该功能将做出默认选择(0)。 ...

java timeout java.util.scanner future callable
2个回答
0
投票

是的,所以您要提交的是Future,然后调用Future#get()并使用TimeUnit和Long参数来指示要放弃操作/执行之前要阻塞的阈值。


0
投票

您可以通过使用labelled break(在下面的代码中为done:)和boolean变量(在下面的代码中为valid)来跟踪输入是否有效。

© www.soinside.com 2019 - 2024. All rights reserved.