TransferQueue實例

本文主要簡介一下TransferQueue。html

TransferQueue

TransferQueue(java7引入)繼承了BlockingQueue(BlockingQueue又繼承了Queue)並擴展了一些新方法。生產者會一直阻塞直到所添加到隊列的元素被某一個消費者所消費(不單單是添加到隊列裏就完事)。java

LinkedTransferQueue

LinkedTransferQueue其實是ConcurrentLinkedQueue、SynchronousQueue(公平模式)和LinkedBlockingQueue的超集。並且LinkedTransferQueue更好用,由於它不單單綜合了這幾個類的功能,同時也提供了更高效的實現。ide

對比SynchronousQueue

SynchronousQueue使用兩個隊列(一個用於正在等待的生產者、另外一個用於正在等待的消費者)和一個用來保護兩個隊列的鎖。而LinkedTransferQueue使用CAS操做實現一個非阻塞的方法,這是避免序列化處理任務的關鍵。ui

使用場景

當咱們不想生產者過分生產消息時,TransferQueue可能很是有用,可避免發生OutOfMemory錯誤。在這樣的設計中,消費者的消費能力將決定生產者產生消息的速度。.net

實例

public class LinkedTransferQueueDemo {
    static LinkedTransferQueue<String> lnkTransQueue = new LinkedTransferQueue<String>();
    public static void main(String[] args) {
        ExecutorService exService = Executors.newFixedThreadPool(2);
        Producer producer = new LinkedTransferQueueDemo().new Producer();
        Consumer consumer = new LinkedTransferQueueDemo().new Consumer();
        exService.execute(producer);
        exService.execute(consumer);
        exService.shutdown();
    }
    class Producer implements Runnable{
        @Override
        public void run() {
            for(int i=0;i<3;i++){
                try {
                    System.out.println("Producer is waiting to transfer...");
                    lnkTransQueue.transfer("A"+i);
                    System.out.println("producer transfered element: A"+i);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    class Consumer implements Runnable{
        @Override
        public void run() {
            for(int i=0;i<3;i++){
                try {
                    System.out.println("Consumer is waiting to take element...");
                    String s= lnkTransQueue.take();
                    System.out.println("Consumer received Element: "+s);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

輸出設計

Producer is waiting to transfer...
Consumer is waiting to take element...
producer transfered element: A0
Producer is waiting to transfer...
Consumer received Element: A0
Consumer is waiting to take element...
producer transfered element: A1
Producer is waiting to transfer...
Consumer received Element: A1
Consumer is waiting to take element...
Consumer received Element: A2
producer transfered element: A2

doc

相關文章
相關標籤/搜索