SynchronousQueue的实现 TransferQueue (一)

来源:互联网 发布:java线程同步 编辑:程序博客网 时间:2024/05/17 00:56

先看下 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();            }        }    }}
原创粉丝点击