Une question posée il y a longtemps et la réponse de @Peter est très élaborée. Pour les personnes qui veulent savoir comment TransferQueue fonctionne en pratique, vous pouvez peut-être vous référer à la démo live ci-dessous.
import java.util.concurrent.LinkedTransferQueue;
import java.util.concurrent.TransferQueue;
public class TransferQueueExample {
TransferQueue<String> queue = new LinkedTransferQueue<String>();
class Producer implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
for(int i = 0; i < 2; i++){
try{
System.out.println("Producer waiting to transfer: " + i);
queue.transfer("" + i);
System.out.println("Producer transfered: " + i);
}catch(Exception e){
e.printStackTrace();
}
}
}
}
class Consumer implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
for(int i = 0; i < 2; i++){
try{
Thread.sleep(2000);
System.out.println("Consumer waiting to comsume: " + i);
queue.take();
System.out.println("Consumer consumed: " + i);
}catch(Exception e){
e.printStackTrace();
}
}
}
}
public static void main(String args[]){
TransferQueueExample example = new TransferQueueExample();
new Thread(example.new Producer()).start();
new Thread(example.new Consumer()).start();
}
}
La sortie est :
Producer waiting to transfer: 0
Consumer waiting to comsume: 0
Consumer consumed: 0
Producer transfered: 0
Producer waiting to transfer: 1
Consumer waiting to comsume: 1
Consumer consumed: 1
Producer transfered: 1
El transfer
c'est là que la différence se produit.
Transfère l'élément à un consommateur, en attendant si nécessaire de le faire.
Plus précisément, transfère l'élément spécifié immédiatement s'il y a s'il existe un consommateur qui attend déjà de le recevoir (en take ou timed poll), sinon il attend que l'élément soit reçu par un consommateur.
Comme la javadoc, le transfer
attendra que le consommateur ait emporté le produit.
C'est la raison pour laquelle "Producer waiting to transfer: 0"
est appelé en premier lieu et après environ 2 secondes, après qu'il ait été reçu par le consommateur, la Producer transfered: 0
est alors appelé.