[英]How to stop immediately the task scheduled in Java.util.Timer class
[英]Accessing running task scheduled with java.util.Timer
我正在一個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();
來啟動daemon.getInstance();
。
但是,我希望有一些方法可以訪問正在運行的任務對象的方法(例如,用於監視對象狀態)。 Java類java.util.Timer
似乎不提供訪問運行中對象的方法,它只是調度擴展TimerTask
的對象實例。
有沒有辦法訪問Timer
實例化的“運行中”對象? 我是否必須使用適當的方法對Timer
類進行子類化,以某種方式訪問實例(以某種方式感到“奇怪”)? 我想可能有人曾經做過……在哪里可以找到“程序”的示例?
預先感謝您的反饋。
不要使用Timer
。 ScheduledExecutorService實現要好得多,並且需要一些額外的工作才能提供所需的功能。 出於某些原因,請參見409932 ,以避免使用Timer
。
在Daemon構造函數中,您可以將Worker
的實例收集到某種集合中,並為該集合添加一個getter。 這需要增加對內部Worker
類的訪問級別,並確保Worker
的方法是線程安全的。
另一件事:為什么要為每個作業創建一個新的Timer
? 如果您的工作很快完成,而您又沒有太多工作,則可以考慮將它們全部注冊在一個Timer
。 或者,使用ScheduledThreadPoolExecutor ,在這里您可以選擇大小的線程池。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.