欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java 中 阻塞隊列BlockingQueue詳解及實例

 更新時間:2017年03月31日 10:33:02   作者:gefufeng  
這篇文章主要介紹了java 中 阻塞隊列BlockingQueue詳解及實例的相關(guān)資料,需要的朋友可以參考下

java 中 阻塞隊列BlockingQueue詳解及實例

BlockingQueue很好的解決了多線程中數(shù)據(jù)的傳輸,首先BlockingQueue是一個接口,它大致有四個實現(xiàn)類,這是一個很特殊的隊列,如果BlockQueue是空的,從BlockingQueue取東西的操作將會被阻斷進(jìn)入等待狀態(tài),直到BlockingQueue進(jìn)了東西才會被喚醒.同樣,如果BlockingQueue是滿的,任何試圖往里存東西的操作也會被阻斷進(jìn)入等待狀態(tài),直到BlockingQueue里有空間才會被喚醒繼續(xù)操作。

BlockingQueue的四個實現(xiàn)類:

1.ArrayBlockingQueue:規(guī)定大小的BlockingQueue,其構(gòu)造函數(shù)必須帶一個int參數(shù)來指明其大小.其所含的對象是以FIFO(先入先出)順序排序的.

2.LinkedBlockingQueue:大小不定的BlockingQueue,若其構(gòu)造函數(shù)帶一個規(guī)定大小的參數(shù),生成的BlockingQueue有大小限制,若不帶大小參數(shù),所生成的BlockingQueue的大小由Integer.MAX_VALUE來決定.其所含的對象是以FIFO(先入先出)順序排序的

3.PriorityBlockingQueue:類似于LinkedBlockQueue,但其所含對象的排序不是FIFO,而是依據(jù)對象的自然排序順序或者是構(gòu)造函數(shù)的Comparator決定的順序.

4.SynchronousQueue:特殊的BlockingQueue,對其的操作必須是放和取交替完成的.

BlockingQueue的常用方法:

        1)add(anObject):把a(bǔ)nObject加到BlockingQueue里,即如果BlockingQueue可以容納,則返回true,否則報異常 

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

        3)put(anObject):把a(bǔ)nObject加到BlockingQueue里,如果BlockQueue沒有空間,則調(diào)用此方法的線程被阻斷直到BlockingQueue里面有空間再繼續(xù). 

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

        5)take():取走BlockingQueue里排在首位的對象,若BlockingQueue為空,阻斷進(jìn)入等待狀態(tài)直到Blocking有新的對象被加入為止

例子:

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

生產(chǎn)者:

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("我生產(chǎn)的" + Thread.currentThread().getName());
  System.out.println("我生產(chǎn)的" + Thread.currentThread().getName());
 } catch (InterruptedException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  System.out.println("生產(chǎn)失敗");
 }
 
 }
 
 

}

消費(fèi)者:

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("取出失敗");
  }
 }
 }

}

執(zhí)行類:

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

}

首先是消費(fèi)者循環(huán)等待產(chǎn)品,當(dāng)?shù)谝淮窝h(huán)時執(zhí)行blockingQueue.take(),是拿不出任何產(chǎn)品的,于是進(jìn)入阻塞狀態(tài),兩秒后,生產(chǎn)者生產(chǎn)了一個產(chǎn)品,于是blockingQueue拿到產(chǎn)品,打印了日志,然后消費(fèi)者執(zhí)行第二次循環(huán),發(fā)現(xiàn)blockingQueue.take()又沒拿到產(chǎn)品,于是又進(jìn)入阻塞狀態(tài)。。。依次循環(huán)

 感謝閱讀,希望能幫助到大家,謝謝大家,對本站的支持!

相關(guān)文章

  • SpringBoot 添加本地 jar 文件的操作步驟

    SpringBoot 添加本地 jar 文件的操作步驟

    在平時我們做項目中,需要用到j(luò)ar包文件,有時候是不能從maven遠(yuǎn)程倉庫拉取的,這時候就得考慮用到j(luò)ar文件安裝到本地maven庫中,再添加依賴,今天小編分步驟給大家介紹下SpringBoot 添加本地 jar 文件的流程,一起看看吧
    2021-09-09
  • 分析mybatis運(yùn)行原理

    分析mybatis運(yùn)行原理

    Mybatis是一個優(yōu)秀的持久層框架,它對JDBC操作數(shù)據(jù)庫的過程進(jìn)行封裝,使開發(fā)者只需要關(guān)注sql本身。我們原來使用JDBC操作數(shù)據(jù)庫,需要手動的寫代碼去注冊驅(qū)動、獲取connection、獲取statement等等,現(xiàn)在Mybaits幫助我們把這些事情做了,我們只需要關(guān)注我們的業(yè)務(wù)sql即可
    2021-06-06
  • Spring 日志規(guī)范及作用

    Spring 日志規(guī)范及作用

    日志是在系統(tǒng)運(yùn)行過程中關(guān)鍵的節(jié)點的數(shù),這個些日志的記錄方便當(dāng)系統(tǒng)出現(xiàn)問題方便問題查找,這篇文章主要介紹了Spring 日志規(guī)范及作用,需要的朋友可以參考下
    2024-03-03
  • Mybatis流式查詢并實現(xiàn)將結(jié)果分批寫入文件

    Mybatis流式查詢并實現(xiàn)將結(jié)果分批寫入文件

    這篇文章主要介紹了Mybatis流式查詢并實現(xiàn)將結(jié)果分批寫入文件方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Spring?Cloud整合XXL-Job的示例代碼

    Spring?Cloud整合XXL-Job的示例代碼

    這篇文章主要介紹了springcloud整合xxl-job的示例代碼,主要分為四個過程,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • Java中圖片轉(zhuǎn)換為Base64的示例及注意事項

    Java中圖片轉(zhuǎn)換為Base64的示例及注意事項

    本文介紹了Base64編碼的概念及其作用,同時列舉了在實現(xiàn)圖片轉(zhuǎn)換為Base64過程中需要注意的問題,包括文件大小、讀取異常、圖片格式、網(wǎng)絡(luò)傳輸效率以及數(shù)據(jù)安全性等,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-10-10
  • 如何基于JavaFX開發(fā)桌面程序

    如何基于JavaFX開發(fā)桌面程序

    這篇文章主要介紹了如何基于JavaFX開發(fā)桌面程序,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11
  • 詳解Spring-boot中讀取config配置文件的兩種方式

    詳解Spring-boot中讀取config配置文件的兩種方式

    這篇文章主要介紹了詳解Spring-boot中讀取config配置文件的兩種方式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • SpringBoot實現(xiàn)文件上傳下載功能小結(jié)

    SpringBoot實現(xiàn)文件上傳下載功能小結(jié)

    最近做的一個項目涉及到文件上傳與下載功能。SpringBoot后臺如何實現(xiàn)文件上傳下載呢?下面有單文件上傳和多文件上傳功能,感興趣的朋友一起看看吧
    2017-08-08
  • springboot + mybatis-plus實現(xiàn)多表聯(lián)合查詢功能(注解方式)

    springboot + mybatis-plus實現(xiàn)多表聯(lián)合查詢功能(注解方式)

    這篇文章主要介紹了springboot + mybatis-plus實現(xiàn)多表聯(lián)合查詢功能,是最簡單的一種注解方式,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09

最新評論