2009-07-07 7 views
2

Java Executor est (pour autant que je sache) une abstraction sur le concept ThreadPool - quelque chose qui peut accepter et exécuter (exécuter) des tâches.ThreadPool est à Executor comme Polling is to?

Je cherche une exception similaire pour le concept Polling. J'ai besoin de continuellement interroger (dequeue) les éléments hors d'une file d'attente spécifique (qui n'implémente pasBlockingQueue), les exécuter et dormir, et répéter tout cela jusqu'à l'arrêt.

Existe-t-il une abstraction prête à l'emploi ou devrais-je écrire quelque chose par moi-même?

(Suggestions d'un meilleur titre sont les bienvenus)

+0

Suggestion de titre: "Comment puis-je intégrer une file d'attente personnalisée dans les exécuteurs j.u.c?" –

+0

Pour moi le titre est très bien, j'ai compris à partir de votre titre ce que vous étiez après. Et il y a un anneau d'énigme. – flq

+0

Eh bien, une suggestion est d'utiliser Quartz ffs! Je ne pense pas que le titre soit clair. L'interrogation est un couple de lignes de code (voir ma réponse ci-dessous), alors qu'un pool de threads peut être un millier. Pourquoi auriez-vous besoin d'une couche d'abstraction pour quelques locos? –

Répondre

2

Polling est facile:

Thread t = new Thread(new Runnable() { 
    public void run() { 
     try { 
      while (!t.isInterrupted()) { 
       Object item; 
       while ((item = queue.take()) == null) {//does not block 
        synchronized (lock) { lock.wait(1000L) } //spin on a lock 
       } 
       //item is not null 
       handle(item); 
      } 
     } catch (InterruptedException e) { } 
    } 
}); 
t.start(); 

Peut-être que vous avez besoin de reformuler votre question car je ne suis pas tout à fait sûr exactement ce que vous essayez de faire?

+0

Ma propre file d'attente est quelque chose de personnalisé (une file d'attente GigaSpaces), elle n'implémente pas l'interface BlockingQueue. – ripper234

+0

Ensuite, ajoutez un adaptateur simple qui met en œuvre l'interface et délègue à votre file d'attente impl –

+0

Je ne peux pas - GigaSpaces est une grille distribuée - les opérations push() à la file d'attente sont effectuées sur un autre ordinateur. Ergo, ce dont j'ai besoin est l'interrogation réelle - je ne vois pas comment je peux implémenter BlockingQueue. – ripper234

Questions connexes