簡體   English   中英

訪問使用java.util.Timer安排的運行任務

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM