2010-05-04 7 views
1

Je travaille sur un projet Java où j'ai créé une classe qui ressemble à ceci (version abrégée):Accès tâche en cours d'exécution prévue avec 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; 
    } 
    } 
    ///////////////////////////////////////////// 
} 

Je commence cette classe, par exemple en invoquant daemon.getInstance();.

Cependant, j'aimerais avoir un moyen d'accéder aux méthodes des objets de la tâche en cours (par exemple, pour surveiller l'état des objets). La classe Java java.util.Timer ne semble pas fournir les moyens d'accéder à l'objet en cours d'exécution, elle planifie simplement l'instance d'objet s'étendant TimerTask.

Existe-t-il des moyens d'accéder à l'objet "en cours d'exécution" instancié au sein d'un ? Dois-je sous-classer la classe Timer avec les méthodes appropriées pour accéder d'une manière ou d'une autre à l'instance (cette "sensation" est étrange, en quelque sorte)? Je suppose que quelqu'un aurait pu le faire avant ... où puis-je trouver des exemples de cette "procédure"?

Merci d'avance pour vos commentaires.

Répondre

3

N'utilisez pas Timer. Les implémentations ScheduledExecutorService sont beaucoup mieux et offrent la fonctionnalité que vous voulez avec un travail supplémentaire. Voir 409932 pour certaines raisons pourquoi éviter Timer.

0

Dans le constructeur Daemon, vous pouvez collecter les instances de Worker dans une sorte de collection et ajouter un accesseur pour cette collection. Cela nécessite d'augmenter le niveau d'accès à la classe interne Worker, ainsi que de s'assurer que les méthodes de Worker sont thread safe.

Autre chose: Pourquoi créez-vous un nouveau par travail? Si vos travaux se terminent rapidement, et que vous n'en avez pas trop, envisagez de les enregistrer tous en un seul . Comme alternative, utilisez ScheduledThreadPoolExecutor, où vous avez un pool de threads d'une taille que vous choisissez.

+0

Je crée une nouvelle minuterie par travail parce que chaque travail fait beaucoup de choses en dessous. J'ai omis ce que je pensais être hors de propos pour ma question. – jbatista