本文主要簡介一下TransferQueue。html
TransferQueue(java7引入
)繼承了BlockingQueue(BlockingQueue又繼承了Queue)並擴展了一些新方法。生產者會一直阻塞直到所添加到隊列的元素被某一個消費者所消費(不單單是添加到隊列裏就完事)。java
LinkedTransferQueue其實是ConcurrentLinkedQueue、SynchronousQueue(公平模式)和LinkedBlockingQueue的超集。並且LinkedTransferQueue更好用,由於它不單單綜合了這幾個類的功能,同時也提供了更高效的實現。ide
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