2010-06-06 8 views
1

J'ai un thread consommateur prenant des éléments d'un LinkedBlockingQueue, et je le fais dormir manuellement quand il est vide. J'utilise peek() pour voir si la file d'attente est vide parce que je dois faire des choses avant d'envoyer le fil pour dormir, et je le fais avec queue.wait().Est-ce que add() sur LinkedBlockingQueue notifie les threads en attente?


Alors, quand je suis dans un autre thread et add() un élément à la file d'attente, est-ce avertira automatiquement le fil qui était wait() ing sur la file d'attente?

Répondre

2

Oui, c'est le cas. Ou plutôt, il utilise un objet de verrouillage interne plus efficace et non le verrou de l'objet de la file d'attente externe; Si vous voulez dormir jusqu'à ce que quelque chose arrive dans la file d'attente, faites un blocage take(). (Si vous avez d'autres choses à faire pendant l'attente, déterminez si une file d'attente bloquante est le bon moyen de recevoir des messages d'un autre endroit.)

+0

Il possède en fait deux verrous en interne, l'un traitant la notification de la file d'attente vide et l'autre de la file d'attente complète. Ils sont "privés" - pour de bonnes raisons - alors utilisez l'API telle qu'elle est destinée à être utilisée. –