BlockingQueue阻塞隊列

來源:互聯網
上載者:User

標籤:style   blog   java   color   io   art   re   c   

java.util.concurrent包:
1.Excutors類:通過這個類可獲得多種線程池的執行個體

Excutors.newSingleThreadExecutor():獲得單線程的ExecutorService;Excutors.newFixedThreadPool(int nThreads):獲得固定大小線程池的ExecutorService;Excutors.newCachedThreadPool():建立一個可根據需要建立新線程的線程池,返回ExecutorService。

2.ExecutorService介面

submit(Runnable task):提交一個 Runnable 任務用於執行,並返回一個表示該任務的 Future;
shutdown():啟動一次順序關閉,執行以前提交的任務,但不接受新任務;
shutdownNow():試圖停止所有正在執行的活動任務,暫停處理正在等待的任務,並返回等待執行的工作清單。

3.BlockingQueue介面:阻塞隊列

   支援兩個附加操作:擷取元素時等待隊列變為非空,儲存元素時等待空間變得可用。具體描述為:
   如果BlockingQueue是空的,從BlockingQueue取東西的操作將會被阻斷進入等待狀態,直到BlockingQueue進了東西才會被喚醒.
   如果BlockingQueue是滿的,任何試圖往裡存東西的操作也會被阻斷進入等待狀態,直到BlockingQueue裡有空間才會被喚醒繼續操作.

  (1)BlockingQueue定義的常用方法如下:

add(anObject):把anObject加到BlockingQueue裡,如果BlockingQueue可以容納,則返回true,否則拋出異常.
offer(anObject):把anObject加到BlockingQueue裡,如果BlockingQueue可以容納,則返回true,否則返回false.
put(anObject):把anObject加到BlockingQueue裡,如果BlockingQueue沒有空間,則線程被阻斷,等待可用的空間.
poll(time):擷取並移除BlockingQueue裡排在首位的對象,若不能立即取出,則可以等待time時間,若仍取不到則返回null.
take():擷取並移除BlockingQueue裡排在首位的對象,若不能立即取出,阻斷進入等待狀態.

(2)BlockingQueue有四個具體的實作類別,根據不同需求,選擇不同的實作類別

ArrayBlockingQueue:由數組支援的有界(固定大小)BlockingQueue,其建構函式必須帶一個規定大小的int參數.其所含的對象是以FIFO(先入先出)順序排序的.
LinkedBlockingQueue:無界(大小不定)BlockingQueue,若其建構函式可帶可不帶規定大小的int參數.其所含的對象是以FIFO(先入先出)順序排序的.
PriorityBlockingQueue:無界(大小不定)BlockingQueue,是一個依賴對象的自然順序的優先順序隊列.也可以由建構函式的Comparator決定其順序.
SynchronousQueue:特殊的BlockingQueue,對其的操作必須是放和取交替完成的.同步隊列沒有任何內部容量.

阻塞隊列程式碼範例:

public class BlockingQueueTest {public static void main(String[] args) {test();}static final BlockingQueue<String> queue = new ArrayBlockingQueue<String>(3);static class Producer implements Runnable {public void run() {try {while (true) {queue.put("some thing");//...}} catch (InterruptedException e) {}}}static class Consumer implements Runnable {public void run() {try {while (true) {queue.take();//...}} catch (InterruptedException e) {}}}public static void test() {ExecutorService service = Executors.newCachedThreadPool();Producer producer = new Producer();Consumer consumer = new Consumer();service.submit(producer);service.submit(consumer);// 程式運行5s後,所有任務停止try {Thread.sleep(5000);} catch (InterruptedException e) {}service.shutdownNow();}}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.