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

Java 阻塞隊(duì)列的7種類型小結(jié)

 更新時(shí)間:2025年07月09日 10:16:24   作者:@zcc@  
Java中的阻塞隊(duì)列是線程安全的隊(duì)列結(jié)構(gòu),包括ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue、DelayQueue、SynchronousQueue、LinkedTransferQueue和LinkedBl,下面就來(lái)具體介紹一下,感興趣的可以了解一下

在 Java 中,阻塞隊(duì)列(BlockingQueue) 是一種線程安全的隊(duì)列結(jié)構(gòu),用于實(shí)現(xiàn)生產(chǎn)者-消費(fèi)者模式。它的核心特性是在隊(duì)列為空時(shí)阻塞消費(fèi)者線程,在隊(duì)列滿時(shí)阻塞生產(chǎn)者線程,從而自動(dòng)協(xié)調(diào)線程之間的協(xié)作。

阻塞隊(duì)列的核心特性

  1. 線程安全:所有操作(如 put、take)都是線程安全的。
  2. 阻塞操作
    • 隊(duì)列滿時(shí):生產(chǎn)者線程阻塞(等待消費(fèi)者消費(fèi))。
    • 隊(duì)列空時(shí):消費(fèi)者線程阻塞(等待生產(chǎn)者生產(chǎn))。
  3. 超時(shí)控制:支持帶超時(shí)時(shí)間的操作(如 offer(timeout, unit)poll(timeout, unit))。
  4. 公平策略:部分實(shí)現(xiàn)(如 ArrayBlockingQueue)支持公平鎖,防止線程饑餓。

Java 中的 7 種阻塞隊(duì)列

以下是 Java 提供的 7 種阻塞隊(duì)列及其特點(diǎn)和適用場(chǎng)景:

1. ArrayBlockingQueue(有界隊(duì)列)

  • 特點(diǎn)
    • 基于數(shù)組實(shí)現(xiàn),容量固定(初始化時(shí)指定)。
    • 支持公平鎖(默認(rèn)非公平鎖)。
  • 適用場(chǎng)景
    • 需要嚴(yán)格限制隊(duì)列容量的場(chǎng)景(如任務(wù)量可控的線程池)。
  • 示例代碼
    BlockingQueue<String> queue = new ArrayBlockingQueue<>(3);
    queue.put("A"); // 隊(duì)列滿時(shí)阻塞
    String task = queue.take(); // 隊(duì)列空時(shí)阻塞
    

2. LinkedBlockingQueue(有界/無(wú)界隊(duì)列)

  • 特點(diǎn)
    • 基于鏈表實(shí)現(xiàn),默認(rèn)容量為 Integer.MAX_VALUE(可視為無(wú)界)。
    • 入隊(duì)和出隊(duì)使用獨(dú)立鎖(putLocktakeLock),提高并發(fā)性能。
  • 適用場(chǎng)景
    • 任務(wù)量不可預(yù)測(cè)的高吞吐量場(chǎng)景(如線程池默認(rèn)隊(duì)列)。
  • 示例代碼
    BlockingQueue<Integer> queue = new LinkedBlockingQueue<>(100); // 指定容量
    queue.put(1); // 隊(duì)列滿時(shí)阻塞
    Integer task = queue.take(); // 隊(duì)列空時(shí)阻塞
    

3. PriorityBlockingQueue(無(wú)界優(yōu)先級(jí)隊(duì)列)

  • 特點(diǎn)
    • 無(wú)界隊(duì)列,基于優(yōu)先級(jí)堆實(shí)現(xiàn)。
    • 元素必須實(shí)現(xiàn) Comparable 接口或提供比較器。
  • 適用場(chǎng)景
    • 需要按優(yōu)先級(jí)處理任務(wù)(如緊急任務(wù)優(yōu)先)。
  • 示例代碼
    BlockingQueue<PriorityTask> queue = new PriorityBlockingQueue<>();
    queue.put(new PriorityTask(1)); // 任務(wù)優(yōu)先級(jí)由 compareTo() 決定
    PriorityTask task = queue.take();
    

4. DelayQueue(延遲隊(duì)列)

  • 特點(diǎn)
    • 無(wú)界隊(duì)列,元素必須實(shí)現(xiàn) Delayed 接口。
    • 只有在延遲時(shí)間到達(dá)后,任務(wù)才能被取出。
  • 適用場(chǎng)景
    • 定時(shí)任務(wù)(如緩存過(guò)期、訂單超時(shí))。
  • 示例代碼
    DelayQueue<DelayedTask> queue = new DelayQueue<>();
    queue.put(new DelayedTask(5000)); // 5 秒后可用
    DelayedTask task = queue.take(); // 等待任務(wù)延遲時(shí)間到期
    

5. SynchronousQueue(同步隊(duì)列)

  • 特點(diǎn)
    • 無(wú)容量隊(duì)列,每個(gè)插入操作必須等待一個(gè)對(duì)應(yīng)的移除操作。
    • 生產(chǎn)者和消費(fèi)者直接傳遞數(shù)據(jù)。
  • 適用場(chǎng)景
    • 高吞吐量的短任務(wù)場(chǎng)景(如 newCachedThreadPool)。
  • 示例代碼
    BlockingQueue<String> queue = new SynchronousQueue<>();
    queue.put("X"); // 阻塞直到有消費(fèi)者調(diào)用 take()
    String task = queue.take(); // 阻塞直到有生產(chǎn)者調(diào)用 put()
    

6. LinkedTransferQueue(無(wú)界隊(duì)列)

  • 特點(diǎn)
    • 支持“預(yù)占模式”(生產(chǎn)者和消費(fèi)者直接交互)。
    • 高性能的無(wú)界隊(duì)列。
  • 適用場(chǎng)景
    • 需要高效傳遞任務(wù)的場(chǎng)景(如快速響應(yīng)的系統(tǒng))。
  • 示例代碼
    BlockingQueue<Integer> queue = new LinkedTransferQueue<>();
    queue.put(100); // 直接傳遞給消費(fèi)者
    Integer task = queue.take(); // 立即獲取任務(wù)
    

7. LinkedBlockingDeque(雙向阻塞隊(duì)列)

  • 特點(diǎn)
    • 雙端隊(duì)列,支持從兩端插入/移除元素。
    • 可作為有界或無(wú)界隊(duì)列。
  • 適用場(chǎng)景
    • 工作竊取算法(如 ForkJoinPool)。
  • 示例代碼
    BlockingQueue<String> queue = new LinkedBlockingDeque<>(100);
    queue.put("A"); // 從尾部插入
    String task = queue.take(); // 從頭部移除
    

阻塞隊(duì)列的核心方法

方法行為拋出異常返回布爾值阻塞超時(shí)阻塞
add(E e)插入元素隊(duì)列滿時(shí)拋異常-
offer(E e)插入元素隊(duì)列滿時(shí)返回 false-
offer(E e, long timeout, TimeUnit unit)插入元素超時(shí)后返回 false-
put(E e)插入元素--
remove()移除元素隊(duì)列空時(shí)拋異常-
poll()移除元素隊(duì)列空時(shí)返回 null-
poll(long timeout, TimeUnit unit)移除元素超時(shí)后返回 null-
take()移除元素--

如何選擇阻塞隊(duì)列?

  1. 有界 vs 無(wú)界:
    • 有界隊(duì)列(如 ArrayBlockingQueue):防止內(nèi)存溢出,需合理設(shè)置容量。
    • 無(wú)界隊(duì)列(如 LinkedBlockingQueue):可能導(dǎo)致任務(wù)堆積,需結(jié)合拒絕策略使用。
  2. 優(yōu)先級(jí)需求:
    • 使用 PriorityBlockingQueue 實(shí)現(xiàn)優(yōu)先級(jí)排序。
  3. 延遲任務(wù):
    • 使用 DelayQueue 實(shí)現(xiàn)定時(shí)或延遲執(zhí)行。
  4. 高性能場(chǎng)景:
    • SynchronousQueue 適合高吞吐量的短任務(wù)。
    • LinkedTransferQueue 適合快速傳遞任務(wù)的場(chǎng)景。

示例:使用阻塞隊(duì)列實(shí)現(xiàn)生產(chǎn)者-消費(fèi)者模型

import java.util.concurrent.*;

public class ProducerConsumerExample {
    public static void main(String[] args) {
        BlockingQueue<String> queue = new LinkedBlockingQueue<>(10);

        // 生產(chǎn)者線程
        Thread producer = new Thread(() -> {
            try {
                for (int i = 0; i < 10; i++) {
                    String task = "Task-" + i;
                    queue.put(task); // 隊(duì)列滿時(shí)阻塞
                    System.out.println("Produced: " + task);
                    Thread.sleep(100);
                }
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        });

        // 消費(fèi)者線程
        Thread consumer = new Thread(() -> {
            try {
                while (true) {
                    String task = queue.take(); // 隊(duì)列空時(shí)阻塞
                    System.out.println("Consumed: " + task);
                    Thread.sleep(200);
                }
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        });

        producer.start();
        consumer.start();
    }
}

注意事項(xiàng)

  1. 避免內(nèi)存泄漏
    • 使用無(wú)界隊(duì)列時(shí),需結(jié)合線程池的拒絕策略(如 CallerRunsPolicy)。
  2. 公平性
    • ArrayBlockingQueue 支持公平鎖(構(gòu)造函數(shù)傳入 true)。
  3. 線程中斷
    • 阻塞操作(如 put/take)會(huì)響應(yīng)中斷,需捕獲 InterruptedException。

通過(guò)合理選擇阻塞隊(duì)列類型,可以高效地實(shí)現(xiàn)線程間的協(xié)作,解決生產(chǎn)者-消費(fèi)者問(wèn)題。

到此這篇關(guān)于Java 阻塞隊(duì)列的7種類型小結(jié)的文章就介紹到這了,更多相關(guān)Java 阻塞隊(duì)列內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java實(shí)現(xiàn)郵件發(fā)送

    java實(shí)現(xiàn)郵件發(fā)送

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)郵件發(fā)送,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • 解讀maven項(xiàng)目的打包方式

    解讀maven項(xiàng)目的打包方式

    這篇文章主要介紹了關(guān)于maven項(xiàng)目的打包方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • java面向?qū)ο?API(接口)與集合(ArrayList)

    java面向?qū)ο?API(接口)與集合(ArrayList)

    這篇文章主要介紹了Java語(yǔ)言面向?qū)ο蟮腁PI與集合,還是十分不錯(cuò)的,這里給大家分享下,需要的朋友可以參考,希望能夠給你帶來(lái)幫助
    2021-08-08
  • 詳細(xì)總結(jié)Java堆棧內(nèi)存、堆外內(nèi)存、零拷貝淺析與代碼實(shí)現(xiàn)

    詳細(xì)總結(jié)Java堆棧內(nèi)存、堆外內(nèi)存、零拷貝淺析與代碼實(shí)現(xiàn)

    零拷貝,這是個(gè)耳熟能詳?shù)拿~,是開(kāi)發(fā)崗面試中經(jīng)常提及的問(wèn)題.最近在回顧Netty的基礎(chǔ)原理,還是把NIO中關(guān)于堆外內(nèi)存的知識(shí)點(diǎn)過(guò)了一遍,這里就針對(duì)堆棧內(nèi)存 堆外內(nèi)存和零拷貝這幾個(gè)概念以及相關(guān)知識(shí)做一下記錄,需要的朋友可以參考下
    2021-05-05
  • SpringBoot+Shiro學(xué)習(xí)之密碼加密和登錄失敗次數(shù)限制示例

    SpringBoot+Shiro學(xué)習(xí)之密碼加密和登錄失敗次數(shù)限制示例

    本篇文章主要介紹了SpringBoot+Shiro學(xué)習(xí)之密碼加密和登錄失敗次數(shù)限制示例,可以限制登陸次數(shù),有興趣的同學(xué)可以了解一下。
    2017-03-03
  • MyBatis關(guān)閉一級(jí)緩存的兩種方式(分注解和xml兩種方式)

    MyBatis關(guān)閉一級(jí)緩存的兩種方式(分注解和xml兩種方式)

    這篇文章主要介紹了MyBatis關(guān)閉一級(jí)緩存的兩種方式(分注解和xml兩種方式),mybatis默認(rèn)開(kāi)啟一級(jí)緩存,執(zhí)行2次相同sql,但是第一次查詢sql結(jié)果會(huì)加工處理這個(gè)時(shí)候需要關(guān)閉一級(jí)緩存,本文給大家詳細(xì)講解需要的朋友可以參考下
    2022-11-11
  • Springboot訪問(wèn)templates html頁(yè)面過(guò)程詳解

    Springboot訪問(wèn)templates html頁(yè)面過(guò)程詳解

    這篇文章主要介紹了Springboot訪問(wèn)templates html頁(yè)面過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • @PostConstruct、@Autowired與構(gòu)造函數(shù)的執(zhí)行順序詳解

    @PostConstruct、@Autowired與構(gòu)造函數(shù)的執(zhí)行順序詳解

    這篇文章主要介紹了@PostConstruct、@Autowired與構(gòu)造函數(shù)的執(zhí)行順序,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-08-08
  • jackson json序列化實(shí)現(xiàn)首字母大寫(xiě),第二個(gè)字母需小寫(xiě)

    jackson json序列化實(shí)現(xiàn)首字母大寫(xiě),第二個(gè)字母需小寫(xiě)

    這篇文章主要介紹了jackson json序列化實(shí)現(xiàn)首字母大寫(xiě),第二個(gè)字母需小寫(xiě)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • java中enum的用法

    java中enum的用法

    這篇文章主要介紹了java中enum的用法,包括了枚舉類型的基本定義及用法分析,對(duì)于學(xué)習(xí)Java有著一定的學(xué)習(xí)與借鑒價(jià)值,需要的朋友可以參考下
    2014-11-11

最新評(píng)論

休宁县| 江安县| 昆山市| 沧源| 孟村| 霍山县| 沂源县| 依安县| 尚志市| 柳林县| 剑川县| 岱山县| 荆门市| 轮台县| 建昌县| 奉化市| 盘锦市| 泗阳县| 安岳县| 平阴县| 台安县| 南汇区| 郑州市| 上蔡县| 吴旗县| 寿宁县| 密山市| 威信县| 盐源县| 五指山市| 措美县| 清涧县| 泾川县| 藁城市| 桃园县| 称多县| 托克逊县| 宁乡县| 哈密市| 苗栗市| 黔江区|