一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - java線程并發blockingqueue類使用示例

java線程并發blockingqueue類使用示例

2019-11-01 14:03java教程網 JAVA教程

BlockingQueue是一種特殊的Queue,若BlockingQueue是空的,從BlockingQueue取東西的操作將會被阻斷進入等待狀態直到BlocingkQueue進了新貨才會被喚醒,下面是用BlockingQueue來實現Producer和Consumer的例子

如果BlockingQueue是滿的任何試圖往里存東西的操作也會被阻斷進入等待狀態,直到BlockingQueue里有新的空間才會被喚醒繼續操作。

BlockingQueue提供的方法主要有:

add(anObject): 把anObject加到BlockingQueue里,如果BlockingQueue可以容納返回true,否則拋出IllegalStateException異常。 
offer(anObject):把anObject加到BlockingQueue里,如果BlockingQueue可以容納返回true,否則返回false。 
put(anObject):把anObject加到BlockingQueue里,如果BlockingQueue沒有空間,調用此方法的線程被阻斷直到BlockingQueue里有新的空間再繼續。 
poll(time):取出BlockingQueue里排在首位的對象,若不能立即取出可等time參數規定的時間。取不到時返回null。 
take():取出BlockingQueue里排在首位的對象,若BlockingQueue為空,阻斷進入等待狀態直到BlockingQueue有新的對象被加入為止。

根據不同的需要BlockingQueue有4種具體實現:

(1)ArrayBlockingQueue:規定大小的BlockingQueue,其構造函數必須帶一個int參數來指明其大小。其所含的對象是以FIFO(先入先出)順序排序的。 
(2)LinkedBlockingQueue:大小不定的BlockingQueue,若其構造函數帶一個規定大小的參數,生成的BlockingQueue有大小限制,
若不帶大小參數,所生成的BlockingQueue的大小由Integer.MAX_VALUE來決定。其所含的對象是以FIFO(先入先出)順序排序的。
LinkedBlockingQueue和ArrayBlockingQueue比較起來,它們背后所用的數據結構不一樣,
導致LinkedBlockingQueue的數據吞吐量要大于ArrayBlockingQueue,但在線程數量很大時其性能的可預見性低于ArrayBlockingQueue。 
(3)PriorityBlockingQueue:類似于LinkedBlockingQueue,但其所含對象的排序不是FIFO,而是依據對象的自然排序順序或者是構造函數所帶的Comparator決定的順序。 
(4)SynchronousQueue:特殊的BlockingQueue,對其的操作必須是放和取交替完成的。

 

復制代碼代碼如下:


package com.yao;

 

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class BlockingQueueTest {

 /**
 定義裝蘋果的籃子
  */
 public static class Basket{
  // 籃子,能夠容納3個蘋果
  BlockingQueue<String> basket = new ArrayBlockingQueue<String>(3);

  // 生產蘋果,放入籃子
  public void produce() throws InterruptedException{
   // put方法放入一個蘋果,若basket滿了,等到basket有位置
   basket.put("An apple");
  }
  // 消費蘋果,從籃子中取走
  public String consume() throws InterruptedException{
   // get方法取出一個蘋果,若basket為空,等到basket有蘋果為止
   String apple = basket.take();
   return apple;
  }

  public int getAppleNumber(){
   return basket.size();
  }

 }
 // 測試方法
 public static void testBasket() {
  // 建立一個裝蘋果的籃子
  final Basket basket = new Basket();
  // 定義蘋果生產者
  class Producer implements Runnable {
   public void run() {
    try {
     while (true) {
      // 生產蘋果
      System.out.println("生產者準備生產蘋果:" 
        + System.currentTimeMillis());
      basket.produce();
      System.out.println("生產者生產蘋果完畢:" 
        + System.currentTimeMillis());
      System.out.println("生產完后有蘋果:"+basket.getAppleNumber()+"個");
      // 休眠300ms
      Thread.sleep(300);
     }
    } catch (InterruptedException ex) {
    }
   }
  }
  // 定義蘋果消費者
  class Consumer implements Runnable {
   public void run() {
    try {
     while (true) {
      // 消費蘋果
      System.out.println("消費者準備消費蘋果:" 
        + System.currentTimeMillis());
      basket.consume();
      System.out.println("消費者消費蘋果完畢:" 
        + System.currentTimeMillis());
      System.out.println("消費完后有蘋果:"+basket.getAppleNumber()+"個");
      // 休眠1000ms
      Thread.sleep(1000);
     }
    } catch (InterruptedException ex) {
    }
   }
  }

  ExecutorService service = Executors.newCachedThreadPool();
  Producer producer = new Producer();
  Consumer consumer = new Consumer();
  service.submit(producer);
  service.submit(consumer);
  // 程序運行10s后,所有任務停止
  try {
   Thread.sleep(10000);
  } catch (InterruptedException e) {
  }
  service.shutdownNow();
 }

 public static void main(String[] args) {
  BlockingQueueTest.testBasket();
 }
}

 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: sxx免费看观看美女 sss亚洲国产欧美一区二区 | 国产精品日韩欧美在线 | 国内久久精品视频 | b片在线观看 | 欧美午夜寂寞影院安卓列表 | 午夜dj影院在线视频观看完整 | 国产宅男 | 十六一下岁女子毛片免费 | 久久精品国产久精国产果冻传媒 | 国产黄色大片网站 | 欧美精品久久久久久久影视 | 男人添女人 | 亚洲AV国产精品无码精 | 亚洲精品永久免费 | 玩两个少妇女邻居 | 四虎国产精品免费入口 | 视频在线观看大片 | 国产xxxxxx久色视频在 | 久9青青cao精品视频在线 | yy8090韩国日本三理论免费 | 免费在线观看网址大全 | 国产一区视频在线免费观看 | 成人影院视频 | 日本高清在线观看天码888 | 美女狂揉尿口揉到失禁 | 国产三级精品91三级在专区 | 色戒完整版 | 国产hd老头老太婆 | 久久精品中文闷骚内射 | 草莓香蕉榴莲丝瓜秋葵绿巨人在线看 | 精品女同同性视频很黄很色 | 欧美爽妇 | 驯服有夫之妇HD中字日本 | 久久精品熟女亚洲AV国产 | 欧美亚洲一区二区三区 | 国产精品99久久 | 国产99精品免费视频看6 | 狠狠色成人综合 | 九草在线视频 | 毛片在线观看网站 | 国产亚洲精品网站 |