0

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

我遇到的问题是计时器似乎启动正常,但是当我向他们发送一个错误的布尔值来停止它们时,它们会继续运行,所以我需要知道如何正确停止它们。

在 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();
    }
}

}

例子.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");

    }
}
4

3 回答 3

1

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

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

阅读Timerjavadocs 应该会有所帮助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();
于 2012-08-02T11:46:01.893 回答
1

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

 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 方法。

于 2012-08-02T11:57:25.747 回答
0

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

    Timer timer = new Timer();

    timer.schedule(new TimerTask(){

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

        }

    }, 5000,1000);
于 2012-08-02T11:51:53.247 回答