访问使用java.util.Timer调度的运行任务

时间:2010-05-04 08:45:26

标签: java timer task

我正在开发一个Java项目,我创建了一个类似这样的类(删节版):

public class Daemon {
  private static Timer[] timerarray=null;
  private static Daemon instance=null;

  protected Daemon() {
    ArrayList<Timer> timers = new ArrayList<Timer>();
    Timer t = new Timer("My application");
    t.schedule(new Worker(), 10000,30000);
    timers.add(t);
    //...
    timerarray = timers.toArray(new Timer[]{});
  }
  public static Daemon getInstance() { 
    if(instance==null) instance=new Daemon(); 
    return instance;
  }
  public SomeClass getSomeValueFromWorker(int i) {
    if(timerarray==null || i>=timerarray.length) return null;
    /* 
     * **HOW TO ACCESS THE Worker INSTANCE IN THE Timer ARRAY HERE!? **
     */
    return theValue;
  }

  /////////////////////////////////////////////
  private class Worker extends TimerTask {
    public Worker() {}
    public void run() {
      // do some work
    }
    public SomeReturnClass someMethod(SomeType someParameter) {
      //
      return something;
    }
  }
  /////////////////////////////////////////////
}

我开始上课,例如通过调用daemon.getInstance();

但是,我想要一些方法来访问正在运行的任务对象的方法(例如,用于监视对象的状态)。 Java类java.util.Timer似乎没有提供访问运行对象的方法,它只是调度扩展TimerTask的对象实例。

有没有办法访问Timer内实例化的“正在运行”的对象?我是否必须使用适当的方法对Timer类进行子类化以某种方式访问​​实例(这种“感觉”很奇怪,不知何故)? 我想以前有人可能已经这样做了......在哪里可以找到这个“程序”的例子?

提前感谢您的反馈。

2 个答案:

答案 0 :(得分:3)

请勿使用TimerScheduledExecutorService实现要好得多,并通过一些额外的工作提供您想要的功能。有关为何要避免Timer

的原因,请参阅409932

答案 1 :(得分:0)

在守护进程构造函数中,您可以将Worker的实例收集到某种集合中,并为该集合添加一个getter。这需要增加内部Worker类的访问级别,并确保Worker的方法是线程安全的。

另一件事:为什么你要为每份工作创建一个新的Timer?如果你的工作很快完成,并且你的工作没有太多,可以考虑在一个Timer中注册所有工作。或者,使用ScheduledThreadPoolExecutor,您可以选择一个大小的线程池。