2010-11-05 19 views
0

J'ai une file d'attente d'événements à traiter. Un thread ajoute des événements à la file d'attente.
J'ai créé une tâche exécutable qui dans la méthode run fait tout ce qui est nécessaire pour traiter l'événement.
J'ai déclaré Executors.newCachedThreadPool(); et I execute chaque tâche.Traitement séquentiel des événements via executorservice

 public class EventHandler { 

      private static final ExecutorService handlers = Executors.newCachedThreadPool(); 

      public void handleNextEvent(AnEvent event){ 

        handlers.execute(new Task(evt)); 

      } 


     public class Task implements Runnable{ 

     @Override 
      public void run() { 
      //Event processing 
      } 
     } 

public AnotherClass{  
    public void passEvent(AnEvent evt)//This is called by another thread 
    { 
     EventHandler.handleNextEvent(evt); 

    } 
} 

Mon problème est que si je l'appelle execute de l'exécuteur testamentaire, mon code obtiendra le prochain événement et exécuter suivant runnable par l'exécuteur testamentaire. Mon but est de traiter l'événement suivant de la file d'attente seulement après la fin de la tâche précédente.
Comment saurais-je que la tâche précédente est terminée ou non pour que je sache que je peux encore appeler handleNextEvent?
La mise à jour d'un champ de statut par la tâche est-elle une bonne idée?

Merci

+0

Voulez-vous les événements traiter un après l'autre? –

+0

@ckuetbach: Oui, dans l'ordre où ils entrent. – Cratylus

Répondre

6

Executors.newCachedThreadPool() créera de nouvelles discussions sur la demande, il est donc pas ce que vous voulez. Vous voulez quelque chose comme Executors.newSingleThreadExecutor(), qui va traiter les événements un à la fois, et faire la queue le reste.

Voir javadoc:

Crée un Executor qui utilise un seul thread de travail opérant au large d'une file d'attente sans bornes. (Notez cependant que si ce thread unique se termine en raison d'un échec lors de l'exécution avant l'arrêt, un nouveau prendra sa place si nécessaire pour exécuter les tâches suivantes.) Les tâches sont garanties séquentiellement, et pas plus d'une tâche sera active n'importe quand.

+0

alors à chaque fois que j'appelle execute, le runnable est mis en file d'attente pour être traité par le même thread? – Cratylus

+1

@ user384706: Seulement si votre runnable ne lance pas d'exceptions. Si c'est le cas, le thread va mourir, et un nouveau sera démarré. La seule garantie est qu'un seul thread exécutera vos tâches à la fois. – skaffman