這篇文章主要介紹了java 中阻塞隊列BlockingQueue詳解及實例的相關資料,需要的朋友可以參考下
java 中阻塞隊列BlockingQueue詳解及實例
BlockingQueue很好的解決了多執行緒中資料的傳輸,首先BlockingQueue是一個介面,它大致上有四個實作類,這是一個很特殊的佇列,如果BlockQueue是空的,從BlockingQueue取東西的操作將會被阻斷進入等待狀態,直到BlockingQueue進了東西才會被喚醒.同樣,如果BlockingQueue是滿的,任何試圖往裡存東西的操作也會被阻斷進入等待狀態,直到BlockingQueue裡有空間才會被喚醒繼續操作。
BlockingQueue的四個實作類別:
1.ArrayBlockingQueue:規定大小的BlockingQueue,其建構子必須帶一個int參數來指明其大小.其所含的物件是以FIFO(先入先出)順序排序的.
2.LinkedBlockingQueue:大小不定的BlockingQueue ,若其建構函式帶一個規定大小的參數,產生的BlockingQueue有大小限制,若不帶大小參數,所產生的BlockingQueue的大小由Integer.MAX_VALUE來決定.其所含的物件是以FIFO(先入先出)順序排序的
3.PriorityBlockingQueue:類似於LinkedBlockQueue,但其所含物件的排序不是FIFO,而是依據物件的自然排序順序或是建構函數的Comparator決定的順序.
4.SynchronousQueue:特殊的BlockingQueue,對其的操作必須是放和取交替完成的.
BlockingQueue的常用方法:
# 1)add(anObject):把anObject加到BlockingQueue裡,即如果BlockingQueue可以容納,則回傳true,否則報例外
time):取走BlockingQueue裡排在首位的物件,若無法立即取出,則可以等time參數規定的時間,取不到時返回null
範例:
這個例子主要模擬了生產者與消費者之間的工作流程,是一個簡單的消費者等待生產者生產產品供消費者消費的場景。 生產者:package com.gefufeng; import java.util.concurrent.BlockingQueue; public class Producter implements Runnable{ private BlockingQueue<String> blockingQueue; public Producter(BlockingQueue<String> blockingQueue){ this.blockingQueue = blockingQueue; } @Override public void run() { try { blockingQueue.put("我生产的" + Thread.currentThread().getName()); System.out.println("我生产的" + Thread.currentThread().getName()); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println("生产失败"); } } }
消費者:
package com.gefufeng; import java.util.concurrent.BlockingQueue; public class Customer implements Runnable{ private BlockingQueue<String> blockingQueue; public Customer(BlockingQueue<String> blockingQueue){ this.blockingQueue = blockingQueue; } @Override public void run() { for(;;){ try { String threadName = blockingQueue.take(); System.out.println("取出:" + threadName); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println("取出失败"); } } } }執行類別:
package com.gefufeng; import java.util.concurrent.ArrayBlockingQueue; public class Executer { public static void main(String[] args) { ArrayBlockingQueue<String> arrayBlockingQueue = new ArrayBlockingQueue<String>(2); Producter producter = new Producter(arrayBlockingQueue); Customer cusotmer = new Customer(arrayBlockingQueue); new Thread(cusotmer).start(); for(;;){ try { Thread.sleep(2000); new Thread(producter).start(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }首先是消費者
以上是java中阻塞佇列BlockingQueue的範例程式碼分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!