我正在开发一个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
类进行子类化以某种方式访问实例(这种“感觉”很奇怪,不知何故)?
我想以前有人可能已经这样做了......在哪里可以找到这个“程序”的例子?
提前感谢您的反馈。
答案 0 :(得分:3)
请勿使用Timer
。 ScheduledExecutorService实现要好得多,并通过一些额外的工作提供您想要的功能。有关为何要避免Timer
。
答案 1 :(得分:0)
在守护进程构造函数中,您可以将Worker
的实例收集到某种集合中,并为该集合添加一个getter。这需要增加内部Worker
类的访问级别,并确保Worker
的方法是线程安全的。
另一件事:为什么你要为每份工作创建一个新的Timer
?如果你的工作很快完成,并且你的工作没有太多,可以考虑在一个Timer
中注册所有工作。或者,使用ScheduledThreadPoolExecutor,您可以选择一个大小的线程池。