先看下 TransferQueue
下面介绍它的几个方法:
transfer(E e)
若当前存在一个正在等待获取数据的消费者线程,该消费者线程,会立刻得到这个数据。否则,将e插入到队列的尾部,并且当前线程进入阻塞状态。即在没有消费者的情况下,生成者也无法进行生产。
tryTransfer (E e)若当前存在一个正在等待获取的消费者线程,则该方法会即刻转移e,并返回true,若不存在则返回false。但是并不将e插入到队列中。这个方法不会阻塞当前线程。
3.hasWaitingConsumer()和getWaitingConsumerCount()用来判断当前是否有处于等待状态的消费者线程,和正在等待消费的消费者线程的个数。
4.tryTransfer(E e, long timeout, TimeUnit unit) 若当前存在一个正在等待获取的消费者线程,会立即传输给它; 否则将元素e插入到队列尾部,并且等待被消费者线程获取消费掉。若在指定的时间内元素e无法被消费者线程获取,则返回false,同时该元素从队列中移除。
以下上面的方法在使用demo
public class TransferQueueTest {
private static TransferQueue<String> queue = new LinkedTransferQueue<String>();
public static void main(String args[]) throws InterruptedException {
new Productor(1).start();
new Productor(2).start();
Thread.sleep(100);
System.out.println(" over.size"+queue.size());
boolean flag =queue.hasWaitingConsumer();
System.out.println(" flag "+flag);
int count =queue.getWaitingConsumerCount();
System.out.println(" count "+count);
queue.take();
Thread.sleep(200);
System.out.println(" over.size"+queue.size());
}
static class Productor extends Thread {
private int id;
public Productor(int id) {
this.id = id;
}
public void run() {
try {
String result = "id:" + this.id;
System.out.println("begin to produce" + result);
queue.transfer(result);
System.out.println(" success to produce"+result);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}