Différence entre BlockingQueue et TransferQueue
Je suis un peu confus quant à ce qu'est la différence entre BlockingQueue/LinkedBlockingQueue et la nouvelle TransferQueue/LinkedTransferQueue types de jsr166y et java 7
Vous devez vous connecter pour publier un commentaire.
De TransferQueue Javadoc:
En d'autres termes, lorsque vous utilisez BlockingQueue, vous ne pouvez mettre de l'élément dans la file d'attente (et de la bloquer en cas de file d'attente est pleine). Avec TransferQueue, vous pouvez bloquer jusqu'à ce que d'autres thread reçoit votre élément (vous devez utiliser les nouvelles
transfer
méthode). C'est la différence. Avec BlockingQueue, vous ne pouvez pas attendre jusqu'à ce que d'autres thread supprime votre élément (uniquement lorsque vous utilisez SynchronousQueue, mais qui n'est pas vraiment une file d'attente).Autre que cela, TransferQueue est aussi un BlockingQueue. Découvrez de nouvelles méthodes disponibles dans les TransferQueue: http://download.oracle.com/javase/7/docs/api/java/util/concurrent/TransferQueue.html (transfert, tryTransfer, hasWaitingConsumer, getWaitingConsumerCount).
Collections Cadre des Améliorations dans Java SE 7 dit explicitement:
tryTransfer()
d'offrir un élément que si il y a une attente des consommateurs.En bref, BlockingQueue garantit que l'élément faite par le producteur doivent être dans la file d'attente, alors que TransferQueue obtient un pas de plus, elle garantit que l'élément "consommée" par certains consommateurs.
Une question il y a longtemps et @la réponse de Pierre est vraiment complexe. Pour les personnes qui veulent savoir comment TransferQueue fonctionne dans la pratique, peut-être que vous pouvez vous référer à la démo ci-dessous.
La sortie est:
La
transfer
est là que la différence se passe.Que la javadoc, le
transfer
va attendre jusqu'à ce que le consommateur a pris le produit à l'écart.C'est la raison pour laquelle
"Producer waiting to transfer: 0"
est appelé tout d'abord, et après environ 2 secondes, après qu'il a été reçu par le consommateur, leProducer transfered: 0
est appelé ensuite.Bien qu'il semble y avoir une certaine forme de différence de performances; voir ArrayBlockingQueue vs LinkedTransferQueue et amis