Доступ к запущенной задаче запланирован с помощью java.util.Timer - PullRequest
1 голос
/ 04 мая 2010

Я работаю над проектом 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 ]

3 голосов
/ 04 мая 2010

Не используйте Timer. Реализации ScheduledExecutorService намного лучше и предоставляют желаемую функциональность с некоторой дополнительной работой. См. 409932 по некоторым причинам, почему следует избегать Timer.

0 голосов
/ 04 мая 2010

В конструкторе Daemon вы можете собрать экземпляры Worker в какую-то коллекцию и добавить геттер для этой коллекции. Для этого необходимо повысить уровень доступа к внутреннему классу Worker, а также убедиться, что методы Worker поточно-ориентированы.

Другое дело: почему вы создаете новый Timer на работу? если ваша работа заканчивается быстро и у вас их не так много, рассмотрите возможность регистрации всех в одной Timer. В качестве альтернативы используйте ScheduledThreadPoolExecutor , где у вас есть пул потоков выбранного вами размера.

...