Вопрос давным-давно и @ Петр ответ действительно сложный.Для людей, которые хотят знать, как TransferQueue работает на практике, возможно, вы можете обратиться к демонстрационной версии ниже.
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();
}
}
Вывод:
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
Здесь transfer
разница случается.
Передает элемент потребителю, ожидая, если это необходимо,
Точнее, передает указанный элемент немедленно, если существует потребитель, уже ожидающий его полученияили синхронизированный опрос), иначе ожидает, пока элемент не будет получен потребителем.
Как и Javadoc, transfer
будет ждать, пока потребитель не заберет продукт.
По этой причине сначала вызывается "Producer waiting to transfer: 0"
, а через 2 секунды после его получения потребителем вызывается Producer transfered: 0
.