在Java中停止计时器事件

时间:2012-08-02 10:50:32

标签: java function events timer

我试图在类中使用单个函数来启动和停止使用布尔值链接到int值的计时器。因此,例如,如果我启动了一个int为0的计时器,那么它将是timer0,如果它是3则是timer3,依此类推。

我遇到的问题是计时器似乎开始没问题但是当我发送一个假bool来阻止它们时它们会继续运行所以我需要知道如何才能正确阻止它们。

在Class.java中,代码是:

public void Event(final int value, boolean run, int time){

    if(run){
        System.out.println(run);

        Timer timer = new Timer();

        timer.schedule( new TimerTask() {
            public void run() {
                // The needed code will go here
                System.out.println(value + " Event run");
            }
         }, 0, time); // Every second
    } else {
    }

} 

然后,对于我的Main.java,代码是:

System.out.println("Start Timer 0 Event");
r.Event(0, true, 1000);

System.out.println("Start Timer 1 Event");
r.Event(1, true, 250);

System.out.println("Start Timer 2 Event");
r.Event(2, true, 250);

r.Event(0, false, 1000); // Not Working as i need
System.out.println("Stop Timer 0 Event");

基本上我只想让每组设定的事件在每次设定的时间内重复,直到我停止它们并且可能有很多一起运行。如果定时器不是最好的方法,那么替代方案就可以了,但它需要以与描述相同的方式工作。


根据要求,这里是我的计时器的可运行代码。

MyClass.java:

package com.z;

import java.awt.*;
import java.util.*;
import java.util.TimerTask;

public class MyClass {

////////////////////////////////////////////////////////////
//Name: Event (BROKEN)
////////////////////////////////////////////////////////////
public void Event(final int value, boolean run, int time){

    Timer timer = new Timer("" + value, true);

    if(run){
        System.out.println(run);

        timer.schedule( new TimerTask() {
            public void run() {
                // Code here
                System.out.println(value + " Event run");
            }
         }, 0, time); // Every second
    } 

    if (!run) {
        timer.cancel();
    }
}

}

Example.java:

package com.z;

import java.awt.*;
import java.awt.event.*;

public class Example {

    public static void main(String[] args) {

    MyClass r = new MyClass();

    ////////////////////////////////////////////////////////////
    // Event (BROKEN)
    ////////////////////////////////////////////////////////////
    System.out.println("Start Timer 0 Event");
    r.Event(0, true, 1000);

    System.out.println("Start Timer 1 Event");
    r.Event(1, true, 250);

    r.Event(0, false, 1000);
    System.out.println("Stop Timer 0 Event");

    }
}

3 个答案:

答案 0 :(得分:1)

采用3个args的timer.schedule方法重复执行,因此如果run为true,则计时器将开始执行任务。

如果您想停止计时器,可以随时拨打timer.cancel,但需要在Event方法之外保存对计时器的引用。

阅读Timer javadocs应该有助于http://docs.oracle.com/javase/6/docs/api/java/util/Timer.html

编辑:这是一个如何运作的例子

Timer startTimer(final int value, final long time) {
   Timer timer = new Timer("Timer" + value);
   timer.schedule( new TimerTask() {
            public void run() {
                // Code here
                System.out.println(value + " Event run");
            }
         }, 0, time); // Every second
   return timer;
}

Timer t0 = startTimer(0,1000);
Timer t1 = startTimer(1,1000);

// stop t0
t0.cancel();

答案 1 :(得分:1)

另一个解决方案是,不是使用Timer,因为每个计时器都是单个线程,并且它的运行耗费资源。您可以创建一个检查Task Queu的Thread。任务可以使用句点参数进行调度。调度意味着将任务添加到队列中。主线程检查每个任务是否在队列中等待的时间超过其周期值。

 while (running) {
     Timer timer = timerQueue.poll();
     if (timer.nextExecutionTime < System.currentTimeMillis()) {
        timer.timerExpire();
     }
     else {
        // nextexecution time degismeden yeniden schedule edilir.
        reschedule(timer);
     }
  }// while

在这个例子中,Timer是我自己的类,包含TimerListener。启动Timer任务操作时会在timerExpire方法中写入。

答案 2 :(得分:0)

计时器将在计划后运行5秒并保持每1秒运行一次,直到调用timer.cancel。

    Timer timer = new Timer();

    timer.schedule(new TimerTask(){

        @Override
        public void run() {
            System.out.println("Timer task");

        }

    }, 5000,1000);