大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學習攻略 Java學習 Java線程安全的阻塞隊列

Java線程安全的阻塞隊列

更新時間:2022-07-29 10:58:53 來源:動力節點 瀏覽1854次

在本Java教程中,動力節點小編將通過相同的生產者/消費者概念來解釋BlockingQueue in Java.

Java中阻塞隊列的優點是什么?

Ajava.util.Queue 支持在檢索元素時等待隊列變為非空,并在存儲元素時等待隊列中的空間變為可用的操作。

我們需要創建四個 Java 類:

CrunchifyMessage.java 放置和獲取消息

CrunchifyBlockingProducer.java將消息放入隊列

CrunchifyBlockingConsumer.java 從隊列中獲取消息

CrunchifyBlockingMain.java 開始測試

BlockingQueue 實現是thread-safe. 所有排隊方法本質上都是原子的并且使用內部鎖。

讓我們開始在 Java 中實現線程安全的 BlockingQueue

第1步

創建類 CrunchifyMessage.java。這是簡單的Java 對象。

package com.crunchify.example;
/**
 * @author Crunchify.com 
 * simple Message class to put and get message into queue
 */
public class CrunchifyMessage {
    private String crunchifyMsg;    
    public CrunchifyMessage(String string) {
        this.crunchifyMsg = string;
    }    
    public String getMsg() {
        return crunchifyMsg;
    }
}

第2步

CrunchifyBlockingProducer.java 創建創建簡單味精并將其放入隊列的生產者 。

package com.crunchify.example;
import java.util.concurrent.BlockingQueue;
/**
 * @author Crunchify.com
 * 
 */
public class CrunchifyBlockingProducer implements Runnable {  
    private BlockingQueue<CrunchifyMessage> crunchQueue;    
    public CrunchifyBlockingProducer(BlockingQueue<CrunchifyMessage> queue) {
        this.crunchQueue = queue;
    }    
    @Override
    public void run() {
        // producing CrunchifyMessage messages
        for (int i = 1; i <= 5; i++) {
            CrunchifyMessage msg = new CrunchifyMessage("i'm msg " + i);
            try {
                Thread.sleep(10);
                crunchQueue.put(msg);
                System.out.println("CrunchifyBlockingProducer: Message - " + msg.getMsg() + " produced.");
            } catch (Exception e) {
                System.out.println("Exception:" + e);
            }
        }        
        // adding exit message
        CrunchifyMessage msg = new CrunchifyMessage("All done from Producer side. Produced 50 CrunchifyMessages");
        try {
            crunchQueue.put(msg);
            System.out.println("CrunchifyBlockingProducer: Exit Message - " + msg.getMsg());
        } catch (Exception e) {
            System.out.println("Exception:" + e);
        }
    }   
}

第3步

創建 CrunchifyBlockingConsumer.java 從隊列中消費消息的類。

package com.crunchify.example;
import java.util.concurrent.BlockingQueue;
/**
 * @author Crunchify.com
 * 
 */ 
public class CrunchifyBlockingConsumer implements Runnable {   
    private BlockingQueue<CrunchifyMessage> queue;    
    public CrunchifyBlockingConsumer(BlockingQueue<CrunchifyMessage> queue) {
        this.queue = queue;
    }    
    @Override
    public void run() {
        try {
            CrunchifyMessage msg;            
            // consuming messages until exit message is received
            while ((msg = queue.take()).getMsg() != "exit") {
                Thread.sleep(10);
                System.out.println("CrunchifyBlockingConsumer: Message - " + msg.getMsg() + " consumed.");
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }   
}

第4步

創建 CrunchifyBlockingMain.java 運行 BlockingQueue測試的簡單方法。運行這個程序來檢查 BlockingQueue 的行為。

package com.crunchify.example;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue; 
/**
 * @author Crunchify.com
 * 
 */
public class CrunchifyBlockingMain {   
    public static void main(String[] args) {       
        // Creating BlockingQueue of size 10
        // BlockingQueue supports operations that wait for the queue to become non-empty when retrieving an element, and
        // wait for space to become available in the queue when storing an element.
        BlockingQueue<CrunchifyMessage> crunchQueue = new ArrayBlockingQueue<>(10);
        CrunchifyBlockingProducer crunchProducer = new CrunchifyBlockingProducer(crunchQueue);
        CrunchifyBlockingConsumer crunchConsumer = new CrunchifyBlockingConsumer(crunchQueue);        
        // starting producer to produce messages in queue
        new Thread(crunchProducer).start();        
        // starting consumer to consume messages from queue
        new Thread(crunchConsumer).start();        
        System.out.println("Let's get started. Producer / Consumer Test Started.\n");
    }   
}

BlockingQueue不接受空元素。在嘗試添加、放置或提供null時,實現會拋出NullPointerException。

null用作標記值以指示輪詢操作失敗。

結果:

Let's get started. Producer / Consumer Test Started.
CrunchifyBlockingProducer: Message - i'm msg 1 produced.
CrunchifyBlockingProducer: Message - i'm msg 2 produced.
CrunchifyBlockingConsumer: Message - i'm msg 1 consumed.
CrunchifyBlockingConsumer: Message - i'm msg 2 consumed.
CrunchifyBlockingProducer: Message - i'm msg 3 produced.
CrunchifyBlockingConsumer: Message - i'm msg 3 consumed.
CrunchifyBlockingProducer: Message - i'm msg 4 produced.
CrunchifyBlockingConsumer: Message - i'm msg 4 consumed.
CrunchifyBlockingProducer: Message - i'm msg 5 produced.
CrunchifyBlockingProducer: Exit Message - All done from Producer side. Produced 50 CrunchifyMessages
CrunchifyBlockingConsumer: Message - i'm msg 5 consumed.
CrunchifyBlockingConsumer: Message - All done from Producer side. Produced 50 CrunchifyMessages consumed.

什么時候應該使用 java.util.concurrent.BlockingQueue?

當您想限制某種傳入請求時,您應該使用相同的

生產者可以通過無限隊列遠遠領先于消費者。如果消費者沒有趕上生產者,那么它可能會導致 OutOfMemoryError. 在這種情況下,最好向潛在的生產者發出隊列已滿的信號,并在失敗后迅速放棄。

換句話說:生產者自然受到限制。

阻塞隊列通常用于并發應用程序

它提供了正確的、線程安全的實現

內存消耗也應該受到限制

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 人人狠狠综合久久亚洲 | 国产精品视频免费播放 | 精品一区二区三区视频在线观看 | 奇米网第四色 | 日韩在线视频免费播放 | 天天干天天干天天干天天干天天干 | 久久久国产精品va麻豆 | 欧美aaaaaaaa| 曰本女人一级毛片看一级毛 | 奇米影视第四色在线 | 国产一区福利 | 亚洲一区二区三区影院 | 久久精品影院永久网址 | 久久一级视频 | 欧美日韩中文字幕在线手机版本 | 色婷婷天天综合在线 | 国产精品亚洲一区二区三区久久 | 亚洲成人综合在线 | 日韩视频欧美视频 | 二区国产 | 国产在线麻豆一区二区 | 欧美日韩永久久一区二区三区 | 国产欧美精品一区aⅴ影院 国产欧美精品一区二区 | 奇米影视7777777 | 四虎在线视频观看大全影视 | 高清人人天天夜夜曰狠狠狠狠 | 最近中文国语字幕在线播放视频 | 日本一级在线播放线观看免 | 看全色黄大色大片免费视频 | 不卡影院 | 精品一区二区三区的国产在线观看 | 狼人久久尹人香蕉尹人 | 欧美在线看片 | 69日本人xxxx16—18| 久一视频在线观看 | 日本黄页网 | 亚洲国产欧美自拍 | 最近中文2019视频在线 | 久久久久久97| 亚洲经典在线中文字幕 | 蕾丝视频永久在线入口香蕉 |