如何停止等待用户输入?

我正在构建一个程序来询问乘法,我想设置一个计时器来强制该人在给定时间内给出答案:

  1. 如果此人在计时器结束前回答:请进行下一次乘法
  2. 如果计时器到达终点,则停止等待用户输入:转到下一个乘法

目前,案例1可以完成,但不是2 ,我正在考虑return;的方法return; 从一个线程内的方法或其他东西,我不知道如何

所以我遇到了一个问题,如果Scanner打开,等待输入,如何阻止? 我已经尝试将它放在一个线程和interrupt()它或使用boolean作为标志,但它不会停止Scanner


 class Multiplication extends Calcul { Multiplication() { super((nb1, nb2) -> nb1 * nb2); } @Override public String toString() { return getNb1() + "*" + getNb2(); } } abstract class Calcul { private int nb1, nb2; private boolean valid; private boolean inTime = true; private boolean answered = false; private BiFunction function; Calcul(BiFunction f) { this.nb1 = new Random().nextInt(11); this.nb2 = new Random().nextInt(11); this.function = f; } void start() { Scanner sc = new Scanner(System.in); System.out.println("What much is " + this + " ?"); Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { if (!answered) { inTime = false; } } }, 5 * 1000); int answer = Integer.parseInt(sc.nextLine()); if (inTime) { checkAnswer(answer); timer.cancel(); } } private void checkAnswer(int answer) { System.out.println("You said " + answer); valid = (function.apply(nb1, nb2) == answer) && inTime; answered = true; } int getNb1() { return nb1; } int getNb2() { return nb2; } boolean isValid() { return valid; } public static void main(String[] args) { List l = Arrays.asList(new Multiplication(), new Multiplication(), new Multiplication()); l.forEach(Calcul::start); } } 

您可以检查System.in.available() > 0以查看是否有要读取的行。 仅当返回true时,才调用sc.nextLine()来实际接收输入。

一个例子:

 Scanner sc = new Scanner(System.in); long sTime = System.currentTimeMillis(); while (System.currentTimeMillis() - sTime < 5000) { if (System.in.available() > 0) { System.out.println(sc.nextLine()); } } sc.close(); 

如果有东西需要读取并再打印出来,它会从控制台读取5秒钟。 注意:实际使用它时,您可能会在循环中抛出一个sleep ,而不是拥抱许多系统资源。

请注意,这是一个可行的解决方案: available()往往是一种不可靠的方法,可以进行一些估算并且可能出错。 我可能不会在时间要求严格的系统等中依赖它。

此外,为了进一步扩展,这种方法依赖于控制台以大多数控制台工作的方式工作(换句话说:我所知道的所有控制台):只有当用户输入换行符时(例如按下回车),该线路实际上是给予的System.in进行处理。 当只有一个字符被输入时,else available()已经返回true。

你试过使用关闭,你可以检查输入是否是“”时间到了并关闭它,可能有帮助;

 if(scanner!=null) { scanner.close(); }