java線程並發blockingqueue類使用樣本_java

來源:互聯網
上載者:User


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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.