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

Java使用阻塞隊(duì)列BlockingQueue實(shí)現(xiàn)生產(chǎn)者消費(fèi)者的方法

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

什么是阻塞隊(duì)列

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

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

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

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

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

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

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

Mantou類

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

/**
 * 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這個(gè)類會(huì)產(chǎn)生消息并將其放入隊(duì)列中。

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消費(fèi)者類

Consumer類會(huì)從隊(duì)列獲取消息進(jìn)行處理。如果獲取的是退出消息則結(jié)束。

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("消費(fèi)饅頭: " + mantou.getMantou());
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

ProducerConsumerService

生產(chǎn)者/消費(fèi)者的服務(wù)類將會(huì)產(chǎn)生固定大小的BlockingQueue,生產(chǎn)者和消費(fèi)者同時(shí)共享該BlockingQueue,該服務(wù)類會(huì)起啟動(dòng)生產(chǎn)者和消費(fèi)者線程。

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線程向隊(duì)列中生產(chǎn)消息
        new Thread(producer).start();
        //開啟 consumer線程 中隊(duì)列中消費(fèi)消息
        new Thread(consumer).start();
        System.out.println("Producer and Consumer has been started");
    }
}

程序運(yùn)行結(jié)果:

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

參考資料

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

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

相關(guān)文章

  • Java編程思想中關(guān)于并發(fā)的總結(jié)

    Java編程思想中關(guān)于并發(fā)的總結(jié)

    在本文中小編給大家整理的是關(guān)于Java編程思想中關(guān)于并發(fā)的總結(jié)以及相關(guān)實(shí)例內(nèi)容,需要的朋友們參考下。
    2019-09-09
  • JAVA垃圾收集器與內(nèi)存分配策略詳解

    JAVA垃圾收集器與內(nèi)存分配策略詳解

    這篇文章介紹了JAVA垃圾收集器與內(nèi)存分配策略,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2015-07-07
  • JAVA調(diào)用JavaScript方法舉例詳解

    JAVA調(diào)用JavaScript方法舉例詳解

    之前在一次機(jī)緣巧合的情況下,需要時(shí)用JAVA執(zhí)行js方法,查閱了一些文檔,找到了相關(guān)解決方法,這里和大家分享一下,下面這篇文章主要給大家介紹了關(guān)于JAVA調(diào)用JavaScript方法的相關(guān)資料,需要的朋友可以參考下
    2023-10-10
  • SpringBoot整合Redis實(shí)現(xiàn)token緩存

    SpringBoot整合Redis實(shí)現(xiàn)token緩存

    于token通常會(huì)被多次使用,我們需要把它保存到緩存中,以減少頻繁地訪問數(shù)據(jù)庫,本文主要介紹了SpringBoot整合Redis實(shí)現(xiàn)token緩存,感興趣的可以了解一下
    2024-02-02
  • Java通過SSM完成水果商城批發(fā)平臺(tái)流程

    Java通過SSM完成水果商城批發(fā)平臺(tái)流程

    這是一個(gè)使用了java+SSM開發(fā)的網(wǎng)上水果商城批發(fā)平臺(tái),是一個(gè)實(shí)戰(zhàn)小練習(xí),具有水果商城批發(fā)該有的所有功能,感興趣的朋友快來看看吧
    2022-06-06
  • SpringBoot使用TraceId進(jìn)行日志鏈路追蹤的實(shí)現(xiàn)步驟

    SpringBoot使用TraceId進(jìn)行日志鏈路追蹤的實(shí)現(xiàn)步驟

    有時(shí)候一個(gè)業(yè)務(wù)調(diào)用鏈場(chǎng)景,很長,調(diào)了各種各樣的方法,看日志的時(shí)候,各個(gè)接口的日志穿插,確實(shí)讓人頭大,所以為了解決這個(gè)問題,本文給大家介紹了SpringBoot使用TraceId進(jìn)行日志鏈路追蹤的實(shí)現(xiàn)步驟,需要的朋友可以參考下
    2024-11-11
  • Java如何實(shí)現(xiàn)上傳文件到服務(wù)器指定目錄

    Java如何實(shí)現(xiàn)上傳文件到服務(wù)器指定目錄

    這篇文章主要介紹了Java如何實(shí)現(xiàn)上傳文件到服務(wù)器指定目錄,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • SpringMVC自定義攔截器實(shí)現(xiàn)過程詳解

    SpringMVC自定義攔截器實(shí)現(xiàn)過程詳解

    這篇文章主要介紹了SpringMVC自定義攔截器實(shí)現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Java解析xml文件遇到特殊符號(hào)異常的情況(處理方案)

    Java解析xml文件遇到特殊符號(hào)異常的情況(處理方案)

    這篇文章主要介紹了Java解析xml文件遇到特殊符號(hào)&會(huì)出現(xiàn)異常的解決方案,實(shí)現(xiàn)思路很簡單通過在讀取xml文件使用SAX解析前讀取reader,具體實(shí)現(xiàn)方法及示例代碼跟隨小編一起看看吧
    2021-05-05
  • java中抽象類和接口的相同和不同點(diǎn)介紹

    java中抽象類和接口的相同和不同點(diǎn)介紹

    大家好,本篇文章主要講的是java中抽象類和接口的相同和不同點(diǎn)介紹,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12

最新評(píng)論