2010-05-04 2 views
1

Я работаю над проектом Java, где я создал класс, который выглядит следующим образом (сокращенный вариант):Доступ к выполняемой задачи по расписанию с java.util.Timer

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 с помощью соответствующих методов, чтобы каким-то образом получить доступ к экземпляру (это «кажется» странным, каким-то образом)? Я полагаю, что кто-то, возможно, сделал это раньше ... Где я могу найти примеры этой «процедуры»?

Заранее благодарю вас за отзыв.

ответ

3

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

0

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

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

+0

Я создаю новый таймер для каждого задания, потому что каждая работа выполняет множество вещей внизу. Я опустил то, что, по моему мнению, не имело значения для моего вопроса. – jbatista

Смежные вопросы