如何停止等待用户输入?

时间:2018-05-03 11:40:29

标签: java timer java.util.scanner interrupt

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

  1. 如果此人在计时器结束前回答:请转到下一个乘法
  2. 如果计时器到达终点,则停止等待用户输入:转到下一个乘法
  3. 目前,案例1可以完成,但2没有,我正在考虑从方法内部return;的方式,如线程或其他东西,我不知道#39;不知道如何

    所以我遇到问题,如果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<Integer, Integer, Integer> function;
    
        Calcul(BiFunction<Integer, Integer, Integer> 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<Calcul> l = Arrays.asList(new Multiplication(), new Multiplication(), new Multiplication());
             l.forEach(Calcul::start);
    }
    }
    

2 个答案:

答案 0 :(得分:3)

您可以查看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()往往是一种不可靠的方法,可以进行一些估算并且可能出错。我可能不会在时间关键系统中依赖它等等。

此外,为了进一步扩展,这种方法依赖于控制台以大多数控制台的工作方式工作(换句话说:我所知道的所有控制台):仅当用户输入换行符时(通过例如,按Enter键,该行实际上被赋予System.in进行处理。当只输入一个字符时,其他available()将返回true。

答案 1 :(得分:0)

你试过使用关闭,你可以检查输入是否是&#34;&#34;当时间到了并关闭时,可能会有所帮助;

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