最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java使用阻塞隊列BlockingQueue實現(xiàn)生產(chǎn)者消費者的方法

 更新時間:2024年11月11日 14:11:06   作者:麥田  
BlockingQueue是一個支持阻塞插入和移除操作的隊列,常用于多線程環(huán)境下的生產(chǎn)者和消費者場景,文章介紹了阻塞隊列BlockingQueue的概念和其在生產(chǎn)者消費者模式中的應用,提供了一個簡單的示例,展示了如何使用ArrayBlockingQueue來實現(xiàn)生產(chǎn)者消費者模式

什么是阻塞隊列

阻塞隊列(BlockingQueue)是一個支持兩個附加操作的隊列。這兩個附加的操作支持阻塞的插入和移除方法。

  • 1、支持阻塞的插入方法:意思是當隊列滿時,隊列會阻塞插入元素的線程,直到隊列不滿。
  • 2、支持阻塞的移除方法:意思是在隊列為空時,獲取元素的線程會等待隊列變?yōu)榉强铡?/li>

阻塞隊列常用于生產(chǎn)者和消費者的場景,生產(chǎn)者是向隊列里添加元素的線程,消費者是從隊列里取元素的線程。 阻塞隊列就是生產(chǎn)者用來存放元素、消費者用來獲取元素的容器。

Java中提供了幾個對BlockingQueue的實現(xiàn)類,如: ArrayBlockingQueue, LinkedBlockingQueue, PriorityBlockingQueue, SynchronousQueue 等

在處理生產(chǎn)者/消費者問題上 我們將會使用ArrayBlockingQueue來實現(xiàn),如下是我們需知道的重要方法:

  • put(E e): 這個方法用于向隊列中插入元素,如果隊列已滿,需要等待可用的這間。
  • E take(): 這個方法用于從隊列頭部獲取或者移除元素,如果隊列為空則需要等待可用的元素。

使用BlockingQueue來解決生產(chǎn)者/消費者 示例

Mantou類

Producer產(chǎn)生的普通Java對象,并添加到隊列中。

/**
 * Producer產(chǎn)生的饅頭類
 * @author itmyhome
 *
 */
public class Mantou {
    private String mantou;
    public Mantou(String mantou) {
        this.mantou = mantou;
    }
    public String getMantou() {
        return mantou;
    }
    public void setMantou(String mantou) {
        this.mantou = mantou;
    }
}

Producer生產(chǎn)者類

Producer這個類會產(chǎn)生消息并將其放入隊列中。

import java.util.concurrent.BlockingQueue;
public class Producer implements Runnable {
    BlockingQueue<Mantou> queue;
    public Producer(BlockingQueue<Mantou> queue) {
        this.queue = queue;
    }
    @Override
    public void run() {
        // 生產(chǎn)饅頭
        for (int i = 0; i < 100; i++) {
            Mantou mt = new Mantou("" + i);
            try {
                Thread.sleep(100);
                queue.put(mt);
                System.out.println("生產(chǎn)饅頭: " + mt.getMantou());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        // 添加退出消息
        Mantou msg = new Mantou("exit");
        try {
            queue.put(msg);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

Consumer消費者類

Consumer類會從隊列獲取消息進行處理。如果獲取的是退出消息則結束。

import java.util.concurrent.BlockingQueue;
public class Consumer implements Runnable {
    BlockingQueue<Mantou> queue;
    public Consumer(BlockingQueue<Mantou> queue) {
        this.queue = queue;
    }
    @Override
    public void run() {
        try {
            Mantou mantou;
            // 獲取并處理消息直到接收到“exit”消息
            while (!(mantou = queue.take()).getMantou().equals("exit")) {
                Thread.sleep(100);
                System.out.println("消費饅頭: " + mantou.getMantou());
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

ProducerConsumerService

生產(chǎn)者/消費者的服務類將會產(chǎn)生固定大小的BlockingQueue,生產(chǎn)者和消費者同時共享該BlockingQueue,該服務類會起啟動生產(chǎn)者和消費者線程。

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
/**
 * @author itmyhome
 *
 */
public class ProducerConsumerService {
    public static void main(String[] args) {
        // 創(chuàng)建大小為10的 BlockingQueue
        BlockingQueue<Mantou> queue = new ArrayBlockingQueue<Mantou>(10);
        Producer producer = new Producer(queue);
        Consumer consumer = new Consumer(queue);
        // 開啟 producer線程向隊列中生產(chǎn)消息
        new Thread(producer).start();
        //開啟 consumer線程 中隊列中消費消息
        new Thread(consumer).start();
        System.out.println("Producer and Consumer has been started");
    }
}

程序運行結果:

Producer and Consumer has been started
生產(chǎn)饅頭: 0
生產(chǎn)饅頭: 1
消費饅頭: 0
消費饅頭: 1
生產(chǎn)饅頭: 2
消費饅頭: 2
生產(chǎn)饅頭: 3
消費饅頭: 3
生產(chǎn)饅頭: 4
消費饅頭: 4
生產(chǎn)饅頭: 5
消費饅頭: 5
生產(chǎn)饅頭: 6
消費饅頭: 6
......

參考資料

[1]: Java并發(fā)編程的藝術
[2]http://www.cnblogs.com/tonyspark/p/3722013.html

到此這篇關于Java使用阻塞隊列BlockingQueue實現(xiàn)生產(chǎn)者消費者的文章就介紹到這了,更多相關Java生產(chǎn)者消費者內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • MybatisPlus中@EnumValue注解使用及應用場景

    MybatisPlus中@EnumValue注解使用及應用場景

    @EnumValue注解標記在枚舉類型的字段上,表示該字段是枚舉值在數(shù)據(jù)庫中存儲的實際值,這對于枚舉的持久化是關鍵,確保枚舉在數(shù)據(jù)庫中的表示與Java枚舉類的一致性,下面就來詳細的介紹一下@EnumValue注解如何使用,感興趣的可以了解一下
    2025-10-10
  • 一篇文章帶你入門Springboot整合微信登錄與微信支付(附源碼)

    一篇文章帶你入門Springboot整合微信登錄與微信支付(附源碼)

    微信支付是騰訊公司的支付業(yè)務品牌,微信支付商戶平臺支持線下場所、公眾號、小程序、PC網(wǎng)站、APP、企業(yè)微信等經(jīng)營場景快速接入微信支付。這里一篇文章帶你入門!
    2021-06-06
  • Java設計模式之單例模式示例詳解

    Java設計模式之單例模式示例詳解

    單例模式是最簡單也是最基礎的設計模式之一,單例模式確保某個類只有一個實例,而且自行實例化并向整個系統(tǒng)提供這個實例。本文將通過一些示例代碼為大家詳細介紹一下單例模式,感興趣的可以了解一下
    2021-12-12
  • Springboot非分布式定時任務實現(xiàn)代碼

    Springboot非分布式定時任務實現(xiàn)代碼

    這篇文章主要介紹了Springboot非分布式定時任務實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-11-11
  • springboot掃碼登錄的簡單實現(xiàn)

    springboot掃碼登錄的簡單實現(xiàn)

    本文主要介紹基于SpringBoot + Vue + Android實現(xiàn)的掃碼登錄,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • SpringBoot整合ShedLock解決定時任務防止重復執(zhí)行的問題

    SpringBoot整合ShedLock解決定時任務防止重復執(zhí)行的問題

    ShedLock是一個用于分布式系統(tǒng)中防止定時任務重復執(zhí)行的庫,本文主要介紹了SpringBoot整合ShedLock解決定時任務防止重復執(zhí)行的問題,具有一定的參考價值,感興趣的可以了解一下
    2025-01-01
  • 現(xiàn)代高效的java構建工具gradle的快速入門

    現(xiàn)代高效的java構建工具gradle的快速入門

    和Maven一樣,Gradle只是提供了構建項目的一個框架,真正起作用的是Plugin,本文主要介紹了gradle入門,文中通過示例代碼介紹的非常詳細,感興趣的小伙伴們可以參考一下
    2021-11-11
  • idea打不開雙擊IDEA圖標沒反應的快速解決方案

    idea打不開雙擊IDEA圖標沒反應的快速解決方案

    這篇文章主要介紹了idea打不開雙擊IDEA圖標沒反應的快速解決方案,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • MyBatis使用Zookeeper保存數(shù)據(jù)庫的配置可動態(tài)刷新的實現(xiàn)代碼

    MyBatis使用Zookeeper保存數(shù)據(jù)庫的配置可動態(tài)刷新的實現(xiàn)代碼

    這篇文章主要介紹了MyBatis使用Zookeeper保存數(shù)據(jù)庫的配置,可動態(tài)刷新,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-08-08
  • java執(zhí)行Linux命令的方法

    java執(zhí)行Linux命令的方法

    這篇文章主要介紹了java執(zhí)行Linux命令的方法,涉及對Java中Runtime.exec()函數(shù)的應用,具有一定的參考借鑒價值,需要的朋友可以參考下
    2014-11-11

最新評論

调兵山市| 南京市| 阜宁县| 盘锦市| 乾安县| 福州市| 竹溪县| 宜章县| 上蔡县| 柘城县| 莱阳市| 阿城市| 汶川县| 霍山县| 新晃| 安多县| 利津县| 岗巴县| 炉霍县| 章丘市| 黔江区| 肇州县| 苏尼特左旗| 武汉市| 丹寨县| 正蓝旗| 襄垣县| 广安市| 广西| 永清县| 永城市| 丽江市| 红安县| 垣曲县| 松潘县| 岳西县| 东台市| 明光市| 玉树县| 凯里市| 桃江县|