J'ai un producteur et un consommateur connecté avec Les enregistrements d'attente consommateurs de la file d'attente et le processus: p> J'ai besoin de mettre en pause cette processus pendant un certain temps d'un autre fil. Comment la mettre en œuvre? P> Maintenant, je pense que le mettre en œuvre telle, mais cela ressemble à une mauvaise solution: p> blockingqueue code>.
3 Réponses :
Vous pouvez utiliser C'est une approche qui me semble propre et Le mécanisme ReentrantLock a un meilleur débit que synchronisé fort>. Lisez ci-dessous l'extrait de article IBM P> En tant que bonus, la mise en œuvre de RetrantLock est beaucoup plus évolutive
sous contrainte que la mise en œuvre actuelle de synchronisée. (Ce
est probable qu'il y aura des améliorations à la performance soutenue
de synchronisée dans une future version de la JVM.) BlockingQingQueue est mieux connu pour la solution de problème de producteur-consommateur, et utilise également la condition Voir l'exemple ci-dessous pris de Java Doc's condition , qui est un exemple de mise en œuvre du producteur - modèle de consommation. p> lecture supplémentaire: p> java.util.concurrent.lock.condiction code> Java Docs Pour faire une pause pendant un moment basé sur la même condition.
P> code> pour l'attente. STRUT > P>
Monsieur Down Downvoter, pouvez-vous prendre la douleur pour expliquer votre vote sur votre baisse s'il vous plaît?
L'homme que je déteste les bowvotes quand la personne prend un certain temps pour fournir une explication perspicace. Si cette solution ne fonctionne pas pour vous, bien. Mais cela ne mérite pas un bowvote. +1 Pour moi, même si je trouve le premier plus simple, la seconde offre une perspicacité sur les threads et la concurrence.
Pas mon bowvote, mais donner un jugement de performance basé sur un article de plus de 10 ans et plus semble-t-il sife.
@Patb merci PAL pour le stand et le support.
@Nathanhughes J'accepterais votre commentaire, j'ai essayé d'obtenir une dernière référence mais n'a pas pu trouver dans ma recherche rapide. Mais je pense que cela tiendra vrai parce que c'est le même mécanisme utilisé dans les implémentations de blocageQueue telles que ArrayBlockingQueue code>,
linkedblockingQueue code>
compris, essayant juste de penser comme le Downvoter ici. pourrait aider à ajouter quelque chose comme celui-ci à la réponse?
@Nathanhughes basé sur votre commentaire, j'ai ajouté une note pour bloquer les files d'attente pour donner une confiance en OP de quelque chose de plus jamais.
Je ne baisse pas cette réponse. Mais je ne comprends pas comment appliquer reentrantlock à ma question. Plus précisément, j'ai essayé de le faire, mais a rencontré des problèmes. Si je comprends bien, je n'ai pas besoin d'utiliser des conditions. Je dois utiliser le verrouillage / déverrouiller uniquement. Mais pourquoi le fil accrocher dans la méthode déverrouille?
Quels problèmes vous courez dans? Vous n'avez aucune condition ni relation entre les consommateurs et les producteurs comme celui de l'exemple? " Mais pourquoi le fil est suspendu dans la méthode Déverrouiller? I>" Je ne l'ai pas compris, vous voulez dire dans votre question?
Je pense que votre solution est simple et élégante et pense que vous devriez le garder avec quelques modifications. Les modifications que je propose sont Synchronisation .
sans elle, Les erreurs de consistance des interférences de fil et de la mémoire peuvent se produire (et très souvent) se produisent. En plus de cela, vous ne pouvez pas attendre code> ou
notify code> sur un verrou que vous ne possédez pas (et que vous le possédiez si vous l'avez à l'intérieur d'un
synchronisé < / code> bloc ..). Le correctif est facile, il suffit d'ajouter un
Mlock code> synchroniser le bloc où vous attendez / en informer dessus. De plus, comme vous changez
imitionné code> à partir d'un fil différent, vous souhaitez la marquer volatile . p>
J'ai écrit le même code. Mais ensuite, je pensais que si vous partez en bloc de synchronisation avec l'attente, je ne dois pas entrer en bloc de synchronisation avec notify. Mais j'avais tort:
Peut-être sera mieux remplacé si (imitionné) pendant (imitionné). Stackoverflow.com/a/2779565/1173794
Créer une nouvelle classe qui étend une implémentation de blocingQueue code>. Ajoutez deux nouvelles méthodes
pause () code> et
imprévues () code>. Si nécessaire, considérez le drapeau
pause code> et utilisez l'autre
blockingqueue2 code> pour attendre (dans mon exemple uniquement dans la méthode
prise () code> et non
mettre () code>):
N'oubliez-vous pas de fournir un peu plus de contexte sur votre besoin spécifique? La raison pour laquelle je demande est que si je dois vraiment mettre en pause quelqu'un dans la chaîne, je préférerais beaucoup mettre en pause le producteur plutôt que le consommateur. Il réalise essentiellement un effet similaire sans que la file d'attente augmente à la capacité alors que la pause est en vigueur.