您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“java中TransferQueue的示例分析”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“java中TransferQueue的示例分析”這篇文章吧。
TransferQueue
TransferQueue(java7引入)繼承了BlockingQueue(BlockingQueue又繼承了Queue)并擴展了一些新方法。生產者會一直阻塞直到所添加到隊列的元素被某一個消費者所消費(不僅僅是添加到隊列里就完事)。
LinkedTransferQueue
LinkedTransferQueue實際上是ConcurrentLinkedQueue、SynchronousQueue(公平模式)和LinkedBlockingQueue的超集。而且LinkedTransferQueue更好用,因為它不僅僅綜合了這幾個類的功能,同時也提供了更高效的實現。
對比SynchronousQueue
SynchronousQueue使用兩個隊列(一個用于正在等待的生產者、另一個用于正在等待的消費者)和一個用來保護兩個隊列的鎖。而LinkedTransferQueue使用CAS操作實現一個非阻塞的方法,這是避免序列化處理任務的關鍵。
使用場景
當我們不想生產者過度生產消息時,TransferQueue可能非常有用,可避免發生OutOfMemory錯誤。在這樣的設計中,消費者的消費能力將決定生產者產生消息的速度。
實例
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
以上是“java中TransferQueue的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。