首頁  >  文章  >  Java  >  阻塞佇列BlockingQueue在java中的實例詳解

阻塞佇列BlockingQueue在java中的實例詳解

Y2J
Y2J原創
2017-04-27 09:37:421717瀏覽

這篇文章主要介紹了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,否則報異常 


        2)offer(anObject):表示如果可能的話,將anObject加到BlockingQueue裡,即如果BlockingQueue可以容納,則回傳true,否則返回false. 


        3)put(anObject):將anObject加到BlockingQueue裡,如果BlockQueue沒有空間,則呼叫此方法的執行緒被阻斷直到BlockingQueue裡面有空間繼續. 


        4)poll(time):取走BlockingQueue裡排在首位的對象,若不能立即取出,則可以等time參數規定的時間,取不到時返回null 


        5)take():取走BlockingQueue裡排在首位的物件,若BlockingQueue為空,阻斷進入等待狀態直到Blocking有新的物件被加入為止

範例:範例:

這個例子主要模擬了生產者和消費者之間的工作流程,是一個簡單的消費者等待生產者生產產品供消費者消費的場景。

生產者:

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();
  }
 }
 }
}

首先是消費者循環等待產品,當第一次循環時執行blockingQueue.take(),是拿不出任何產品的,於是進入阻塞狀態,兩秒後,生產者生產了一個產品,於是blockingQueue拿到產品,打印了日誌,然後消費者執行第二個循環,發現blockingQueue.take()又沒拿到產品,於是又進入阻塞狀態。 。 。依序循環###

以上是阻塞佇列BlockingQueue在java中的實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn