2009-05-06 11 views
16

Je travaille sur un projet qui utilise une file d'attente qui conserve des informations sur les messages qui doivent être envoyés aux hôtes distants. Dans ce cas, un thread est responsable de mettre des informations dans la file d'attente et un autre thread est chargé d'obtenir des informations de la file d'attente et de les envoyer. Le 2ème thread doit vérifier la file d'attente pour l'information périodiquement.Quels sont les avantages de Blocking Queue en Java?

Mais plus tard, j'ai trouvé que c'est la réinvention de la roue :) Je pourrais utiliser une file d'attente de blocage à cet effet.

Quels sont les autres avantages de l'utilisation d'une file d'attente de blocage pour l'application ci-dessus? (Ex: Performances, Modifiable du code, Trucs spéciaux, etc.)

Répondre

26

Le principal avantage est qu'un BlockingQueue fournit une implémentation correcte, sans danger pour les threads. Les développeurs ont mis en œuvre cette fonctionnalité eux-mêmes depuis des années, mais il est difficile de faire les choses correctement. Maintenant, l'exécution a une implémentation développée, révisée et maintenue par des experts en simultanéité.

La nature "bloquante" de la file présente quelques avantages. Tout d'abord, lors de l'ajout d'éléments, si la capacité de la file d'attente est limitée, la consommation de mémoire est également limitée. De même, si les consommateurs de la file d'attente sont trop loin derrière les producteurs, les producteurs sont naturellement limités car ils doivent attendre pour ajouter des éléments. En prenant des éléments de la file d'attente, l'avantage principal est la simplicité; attendre pour toujours est trivial, et attendre correctement un délai d'attente spécifié est seulement un peu plus compliqué.

6

La principale chose que vous éliminez avec la file d'attente de blocage est 'polling'. C'est là que vous dites

Dans ce cas, le 2ème thread doit vérifier périodiquement la file d'attente pour l'information.

Cela peut être très inefficace - en utilisant beaucoup de temps processeur inutile. Il peut également introduire des latences inutiles.

12

Une file d'attente de blocage est une file d'attente qui se bloque lorsque vous tentez de la retirer de la file d'attente et que la file d'attente est vide ou si vous tentez de mettre des éléments en file d'attente. Un thread essayant de retirer la file d'attente d'une file d'attente vide est bloqué jusqu'à ce qu'un autre thread insère un élément dans la file d'attente. Un thread essayant de mettre en file d'attente un élément dans une file d'attente complète est bloqué jusqu'à ce qu'un autre thread fasse de l'espace dans la file d'attente, soit en supprimant un ou plusieurs éléments, soit en effaçant complètement la file d'attente.

Questions connexes