访问使用java.util.Timer调度的正在运行的任务
我正在从事一个Java项目,在该项目中,我创建了一个类似以下内容的类(节略版):访问使用java.util.Timer调度的正在运行的任务,java,timer,task,Java,Timer,Task,我正在从事一个Java项目,在该项目中,我创建了一个类似以下内容的类(节略版): 公共类守护程序{ 专用静态计时器[]timerarray=null; 私有静态守护进程实例=null; 受保护的守护进程(){ ArrayList timers=新的ArrayList(); 定时器t=新定时器(“我的应用程序”); t、 附表(新工人(),100003000); 计时器。添加(t); //... timerarray=timers.toArray(新计时器[]{}); } 公共静态守护程序getI
公共类守护程序{
专用静态计时器[]timerarray=null;
私有静态守护进程实例=null;
受保护的守护进程(){
ArrayList timers=新的ArrayList();
定时器t=新定时器(“我的应用程序”);
t、 附表(新工人(),100003000);
计时器。添加(t);
//...
timerarray=timers.toArray(新计时器[]{});
}
公共静态守护程序getInstance(){
如果(instance==null)instance=new Daemon();
返回实例;
}
public SomeClass从worker获取somevalues(int i){
if(timerarray==null | | i>=timerarray.length)返回null;
/*
***如何在此处访问计时器阵列中的工作者实例**
*/
返回值;
}
/////////////////////////////////////////////
私有类工作程序扩展TimerTask{
公职人员(){}
公开募捐{
//做些工作
}
公共SomeReturnClass someMethod(SomeType someParameter){
//
归还某物;
}
}
/////////////////////////////////////////////
}
我启动这个类,例如通过调用daemon.getInstance()代码>
但是,我希望有一些方法来访问正在运行的任务对象的方法(例如,用于监视对象的状态)。
Java类Java.util.Timer
似乎没有提供访问正在运行的对象的方法,它只是调度扩展TimerTask
的对象实例
是否有方法访问计时器中实例化的“正在运行”对象?我是否必须使用适当的方法对Timer
类进行子类化,才能以某种方式访问实例(某种程度上,这“感觉”很奇怪)?
我想以前可能有人做过这件事。。。我在哪里可以找到这种“程序”的例子
提前感谢您的反馈。不要使用计时器。这些实现要好得多,并通过一些额外的工作提供您想要的功能。有关避免在守护进程构造函数中使用计时器的原因,请参见,您可以将Worker
的实例收集到某种集合中,并为该集合添加一个getter。这需要增加对内部工作者
类的访问级别,并确保工作者
的方法是线程安全的
另一件事:为什么要为每个作业创建一个新的计时器?如果您的作业完成得很快,而且没有太多的作业,请考虑将它们全部注册到单个<代码>定时器< /代码>中。另一种方法是,使用,其中有一个大小由您选择的线程池。我为每个作业创建一个新的计时器,因为每个作业下面都有很多事情要做。我省略了我认为与我的问题无关的内容。
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;
}
}
/////////////////////////////////////////////
}