如何在java中停止计时器

时间:2015-11-16 22:30:06

标签: java timer

我有一个计时器方法,每次用户输入时都会运行。基本上用户有一分钟输入内容或计时器将打印响应,但如果用户在计时器用完之前输入了某些内容,则不会打印响应。基本上,我在取消最后一个计时器并调用一个新计时器时遇到了麻烦,因为如果我不取消计时器,前一个计时器会继续运行,而新计时器会继续被调用,所以它只会造成巨大的混乱。我的方法如下

主:

public static void main(String[] args) {
     while(true) {
          runner();
     }
}

转轮:

public static void runner() {
     timer();
     String s = input.nextLine();
     System.out.println(s);

}

计时器:

public static void timer() {
     TimerTask task = new TimerTask() {
           public void run() {
                System.out.println("Say something already!");
           }
    };
    long delay = TimeUnit.MINUTES.toMillis(1);
    Timer t = new Timer();
    t.schedule(task, delay);
}

我将如何取消此作品。有人要我在TimerTask课程中使用cancel()方法,但我不知道在哪里打电话,甚至不知道如何。

2 个答案:

答案 0 :(得分:1)

让timer()方法返回TimerTask对象,当input.nextLine()返回时,调用TimerTask.cancel()。

public static void runner() {
     TimerTask t = timer();
     String s = input.nextLine();
     t.cancel();
     System.out.println(s);
}

public static void timer() {
     TimerTask task = new TimerTask() {
           public void run() {
                System.out.println("Say something already!");
           }
    };
    long delay = TimeUnit.MINUTES.toMillis(1);
    Timer t = new Timer();
    t.schedule(task, delay);
    return task;
}

也可以返回Timer而调用Timer.cancel()

答案 1 :(得分:-1)

我想这可行:

Main:

TimerTask task;

public static void main(String[] args) {

    Scanner scan = new Scanner(System.in);
    runner();

    while(true) {

        timer(); //run timer
        String line = scan.nextLine(); //read line (happens after hit Enter)
        System.out.println(line);
        //if line is read, then rerun timer which has on next iteration
    }

}

Timer:

public static void timer() {

    if(null != task) {
        task.cancel();
    }

    task = new TimerTask() {
           public void run() {
                System.out.println("Say something already!");
                //timer(); reinit maybe after 1 min again?
           }
    };

    long delay = TimeUnit.MINUTES.toMillis(1);
    Timer t = new Timer();
    t.schedule(task, delay);
}