2010-07-16 6 views
3

J'ai trois instances LinkedBlockingQueue de Java et je voudrais en lire le contenu (opération take) en utilisant un seul thread. L'approche naïve consiste à avoir un fil par file d'attente.Lecture à partir de plusieurs BlockingQueues dans un seul thread

Existe-t-il quelque chose comme l'appel système UNIX select pour bloquer les files d'attente en Java?

Merci.

+0

Vous voulez donc une exclusion mutuelle pour les trois files d'attente, c'est-à-dire qu'un thread peut lire depuis l'une des trois files d'attente à la fois? –

Répondre

2

Eh bien, ces BlockingQueues devaient vraiment être gérés par leurs propres Threads. Quelque chose que je considère essayant est de mettre en place une 4ème queue pour des articles beaucoup plus petits, disons Boolean s, et ai les appels offer() sur chacune des 3 autres files d'attente accompagnent leur insertion en insérant un booléen dans cette 4ème queue. Votre fil peut alors aller dormir sur la 4ème queue, et quand il se réveille il peut peek() dans les 3 autres pour savoir où obtenir les marchandises.

Solution très inélégante, je pense, et je suspecte qu'il y a des conditions de course possibles où vous ne serez pas réveillé proprement quelques fois. Mais cela devrait essentiellement fonctionner.

+4

la 4ème file d'attente peut être la file d'attente des files d'attente. lors de l'ajout d'un élément dans la file d'attente * ith *, ajoutez la file d'attente * ith * à la 4ème file d'attente. le thread bloqué sur la 4ème file d'attente take() recevra la file d'attente * ith * qui * peut * contenir un nouvel élément. – irreputable

+0

C'est une idée diaboliquement intelligente! +1 –

+0

Clever en effet. +1 –

Questions connexes