Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
(Java)如何在满足某些条件时立即取消计时器_Java_Timer - Fatal编程技术网

(Java)如何在满足某些条件时立即取消计时器

(Java)如何在满足某些条件时立即取消计时器,java,timer,Java,Timer,节目 我的程序会问三个数学问题,比如10+5? 它在控制台上一次显示一个问题。用户通过命令行回答,并有5秒的时间回答。下一个问题将仅在用户正确回答问题时显示,或在时间结束时显示 一旦用户在给定时间内正确回答了问题,就需要显示下一个问题(不应该等到时间到了)。当用户回答错误时,计时器应继续,并且不会重新启动。计时器仅在下一个问题出现时重新启动 问题 用户正确回答问题后,程序不会立即取消计时器。 而且,即使时间到了,下一个问题也不会出现;用户必须输入一些内容才能继续下一个问题。 最后,下一个问题还将

节目
我的程序会问三个数学问题,比如10+5? 它在控制台上一次显示一个问题。用户通过命令行回答,并有5秒的时间回答。下一个问题将仅在用户正确回答问题时显示或在时间结束时显示

一旦用户在给定时间内正确回答了问题,就需要显示下一个问题(不应该等到时间到了)。当用户回答错误时,计时器应继续,并且不会重新启动。计时器仅在下一个问题出现时重新启动

问题
用户正确回答问题后,程序不会立即取消计时器。
而且,即使时间到了,下一个问题也不会出现;用户必须输入一些内容才能继续下一个问题。
最后,下一个问题还将在用户输入错误答案时显示

import java.util.Scanner;
import java.util.Timer;
import java.util.TimerTask; 
import java.util.Random;
/** 
 *Simple count down timer demo of java.util.Timer facility.
 */

/*
 * start timer
 * cancel when isLastMoveValid == true
 * start timer again soon
 * */

public class Countdown {
    public static double i = 5;
    public static int answer;
    static Scanner inputs = new Scanner(System.in);
    static Random rand = new Random(); 
    static int num1;
    static int num2;
    static int questionNo = 3;
    public static void main(String args[]) {
        while (questionNo >0) {
            num1 = rand.nextInt(11); 
            num2 = rand.nextInt(11);
            callTimer();       
            System.out.println(num1+ "+" + num2 + "?");
            answer = inputs.nextInt();
        }

    } // end of main method

    public static void callTimer() {

         final Timer timer = new Timer();
         i = 6;

         timer.scheduleAtFixedRate(new TimerTask() {          
             public void run() {
                 i -= 0.001;

                 if (i< 0 || answer == num1 + num2) {
                     questionNo--;              
                     timer.cancel();                
                 }

             } // end of run
         }, 0, 1); // end of scheduleAtFixedRate



    } // end of callTimer
}
import java.util.Scanner;
导入java.util.Timer;
导入java.util.TimerTask;
导入java.util.Random;
/** 
*java.util.timer工具的简单倒计时演示。
*/
/*
*启动计时器
*isLastMoveValid==true时取消
*很快再次启动计时器
* */
公共课倒计时{
公共静态双i=5;
公共静态回答;
静态扫描仪输入=新扫描仪(System.in);
静态随机兰德=新随机();
静态int num1;
静态int num2;
静态int-questionNo=3;
公共静态void main(字符串参数[]){
而(问题号>0){
num1=兰特·耐克斯汀(11);
num2=兰特·耐克斯汀(11);
callTimer();
System.out.println(num1+“+”+num2+“?”);
答案=输入。nextInt();
}
}//主方法结束
公共静态void callTimer(){
最终计时器=新计时器();
i=6;
timer.scheduleAtFixedRate(新TimerTask(){
公开募捐{
i-=0.001;
如果(i<0 | |答案==num1+num2){
问题不——;
timer.cancel();
}
}//运行结束
},0,1);//scheduleAtFixedRate的结尾
}//调用计时器结束
}

您需要将计时器对象作为字段,以便随时访问它。请参见“取消”方法“如何取消”。如果要重新启动计时器,必须创建计时器和timertask的新对象,因为它们会随线程一起被丢弃

请参阅有关Timer.cancel方法的文档:

终止此计时器,放弃所有当前计划的任务。是否执行 不干扰当前正在执行的任务(如果存在)。一次 计时器已终止,其执行线程正常终止, 并且不能在其上安排更多任务

例如,类似这样的事情:

import java.util.Timer;
import java.util.TimerTask;

public class TimerTest
{
    private Timer timer;

    public void cancelTimer()
    {
        this.timer.cancel();
        System.out.println("Canceled timer!");
    }

    public void startTimer()
    {
        // once a timertask is canceled, you can not restart it
        // because the thread is deleted. So we need to create a 
        // new object of a timer and a timertask.
        TimerTask timerTask = new TimerTask()
        {
            @Override
            public void run()
            {
                System.out.println("Hello there!");
            }
        };
        this.timer = new Timer();
        System.out.println("Starting timer ...");
        int period = 1000;
        this.timer.schedule(timerTask, 0, period);
    }

    public static void main(String[] args) throws InterruptedException
    {
        TimerTest tt = new TimerTest();
        tt.startTimer();
        Thread.sleep(5000);
        tt.cancelTimer(); // you can call this method, as soon as u have a correct answer
        Thread.sleep(1000);
        tt.startTimer(); // you can restart your timer as demanded
        Thread.sleep(5000);
        tt.cancelTimer(); // and cancel it again
    }
}

我建议使用
ScheduledExecutorService
,而不是计时器,但方法类似。当您计划任务时,您会得到一个
ScheduledFuture
对象,您可以调用#cancel on。使用此功能,您可以简单地安排5秒后发生的事情,如果您必须(例如,在输入时)超时部分的可能重复项,则可以取消它:或者感谢您的回答!我还有一个问题。如果我没有输入任何输入,并且时间到了,程序将不会终止,因为它仍在等待用户的输入。当时间到了并且没有输入时,如何显示下一个问题或终止程序?这是关于扫描仪对象的另一个问题。您需要找到一种从外部关闭扫描仪的方法。我确信,您可以在扫描仪上调用close方法。我想它也应该关闭当前的用户输入。我测试了它。实际上,您可以使用scanner对象的close方法。您必须考虑使用多个线程。但再一次,这是一个不同的问题。。。