我正在尝试使用此功能构建命令行界面:如果用户花费超过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)。 ...
是的,所以您要提交的是Future,然后调用Future#get()并使用TimeUnit和Long参数来指示要放弃操作/执行之前要阻塞的阈值。
您可以通过使用labelled break(在下面的代码中为done:
)和boolean
变量(在下面的代码中为valid
)来跟踪输入是否有效。