国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

阻塞隊(duì)列(BlockingQueue)

這篇具有很好參考價(jià)值的文章主要介紹了阻塞隊(duì)列(BlockingQueue)。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

阻塞隊(duì)列(BlockingQueue)

阻塞隊(duì)列(BlockingQueue)


  • 阻塞隊(duì)列都實(shí)現(xiàn)了:BlockingQueue
  • JDK提供的七個(gè)阻塞隊(duì)列
    阻塞隊(duì)列(BlockingQueue)

一、特點(diǎn)

1、JDK提供的七個(gè)阻塞隊(duì)列簡介

①. ArrayBlockingQueue

有界 阻塞隊(duì)列——必須指定大小——數(shù)組

②. LinkedBlockingQueue

有界 阻塞隊(duì)列——默認(rèn)大?。篒nteger.MAX_VALUE最大值——鏈表

③. LinkedTransferQueue

無界 阻塞隊(duì)列——鏈表

④. PriorityBlockingQueue

無界 阻塞隊(duì)列——支持優(yōu)先級排序

⑤. DelayQueue

無界 阻塞隊(duì)列——使用優(yōu)先級隊(duì)列實(shí)現(xiàn)的

⑥. SynchronousQueue

不存儲元素 的阻塞隊(duì)列

⑦. LinkedBlockingDeque

雙端 阻塞隊(duì)列——鏈表

2、其他特點(diǎn)

  • 阻塞隊(duì)列默認(rèn)情況下是FIFO(先進(jìn)先出),PriorityBlockingQueue可以設(shè)置優(yōu)先級出隊(duì)列
  • BlockingQueue 不接受 null 元素。試圖 add、put 或 offer 一個(gè) null 元素時(shí),某些實(shí)現(xiàn)會拋出 NullPointerException。null 被用作指示 poll 操作失敗的警戒值。
  • BlockingQueue 實(shí)現(xiàn)是線程安全

二、阻塞隊(duì)列的方法

  • e 表示插入到隊(duì)列的元素
  • 其他特殊的方法,見參考。
  • 常用方法
阻塞隊(duì)列的核心方法有以下幾組
1.拋異常組:add(),remove(),element();
2.返回布爾值組:offer(),poll(),peek();
3.阻塞組:put(),take();
4.超時(shí)組:offer(),poll();

1、插入元素

描述 拋出異常 一直阻塞 返回特殊的值 超時(shí)退出
插入數(shù)據(jù) add(e) put(e) offer(e)
推薦
offer(e, time, unit)
推薦
插入成功 返回true 無返回值 返回true 返回true
插入失敗
(隊(duì)列滿)
拋異常 一直阻塞,直到插入元素 返回false 等10秒(假如設(shè)置的10s)
然后放棄插入,返回false
可用于控制添加元素的速度

2、獲取元素——并移除隊(duì)列的頭元素

描述 拋出異常 一直阻塞 返回特殊的值 超時(shí)退出
獲取元素 remove() take() poll() poll(time, unit)
獲取成功 返回元素 返回元素 返回元素 返回元素
獲取失敗
(隊(duì)列空)
拋異常 一直阻塞,直到獲取到元素 返回null 等10秒(假如設(shè)置的10s)
然后null
可用于控制消費(fèi)的速度

3、獲取元素——不移除隊(duì)列的元素

描述 拋出異常 返回特殊的值
獲取元素 element() peek()
獲取成功 返回元素 返回元素
獲取失敗
(隊(duì)列空)
拋異常 返回null

4、推薦使用

  • 一般情況下 offer() 和 poll() 方法配合使用

程序中常用的是 offer() 和 poll() 方法,因?yàn)檫@兩個(gè)方法比較友好,不會報(bào)錯(cuò)。

  • put() 和 take() 阻塞方法配合使用
  • add() 和 remove() 方法會配合使用

5、測試

  • 自己去測
package com.cc.testproject.utils;

import java.time.LocalDateTime;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.LinkedTransferQueue;
import java.util.concurrent.PriorityBlockingQueue;

/**
 * <p>存放隊(duì)列</p>
 *
 * @author --
 * @since 2024/1/9
 */
public class Task01 {

    //有界阻塞隊(duì)列——FIFO(先進(jìn)先出)——必須指定大小——數(shù)組
    private static final ArrayBlockingQueue<String> QUEUE1 = new ArrayBlockingQueue<>(1);
    //有界阻塞隊(duì)列——FIFO(先進(jìn)先出)——默認(rèn)大?。篿nt最大值——鏈表
    private static final LinkedBlockingQueue <String> QUEUE2 = new LinkedBlockingQueue<>();
    //無界阻塞隊(duì)列——FIFO(先進(jìn)先出)——無限大——鏈表
    private static final LinkedTransferQueue <String> QUEUE3 = new LinkedTransferQueue<>();

    public static void main(String[] args) throws InterruptedException {

        boolean offer = QUEUE1.offer("1");
        System.out.println("第1次添加:" + offer + "-時(shí)間:" + LocalDateTime.now());
        boolean offer1 = QUEUE1.offer("2");
        System.out.println("第2次添加:" + offer1 + "-時(shí)間:" + LocalDateTime.now());

        System.out.println(QUEUE1.take());

//        System.out.println(QUEUE1.element());
        System.out.println(QUEUE1.peek());
        System.out.println(QUEUE1);

//        System.out.println(QUEUE1.poll(5, TimeUnit.SECONDS));
//        System.out.println(QUEUE1.poll());
//        System.out.println(QUEUE1.remove());
//        System.out.println(QUEUE1.take());

//        System.out.println(QUEUE1.remove());
//        System.out.println(QUEUE1.remove());
//        System.out.println(QUEUE1.take());
//        System.out.println(QUEUE1.take());
//        System.out.println(QUEUE1.poll());
//        System.out.println(QUEUE1.poll(5, TimeUnit.SECONDS));

        //如隊(duì)列滿:等10秒,然后放棄插入,返回false
//        boolean offer = QUEUE1.offer("1", 10, TimeUnit.SECONDS);
//        System.out.println("第1次添加:" + offer + "-時(shí)間:" + LocalDateTime.now());
//        boolean offer1 = QUEUE1.offer("2", 10, TimeUnit.SECONDS);
//        System.out.println("第2次添加:" + offer1 + "-時(shí)間:" + LocalDateTime.now());
//
//        System.out.println("添加完成:" + QUEUE1);

        // 如隊(duì)列滿:拋異常
//        boolean add1 = QUEUE1.add("1");
//        System.out.println("第1次添加:" + add1);
//        boolean add2 = QUEUE1.add("2");
//        System.out.println("第2次添加:" + add2);

        //如隊(duì)列滿:一直等
//        QUEUE1.put("1");
//        System.out.println("第1次添加:" + LocalDateTime.now());
//        QUEUE1.put("2");
//        System.out.println("第2次添加:" + LocalDateTime.now());
    }
}

三、使用場景、個(gè)人理解

1、使用場景

  • 需要順序執(zhí)行,且是耗時(shí)操作,可用來裝用戶的請求

  • 阻塞隊(duì)列在多線程編程中有許多使用場景,包括但不限于:

  1. 生產(chǎn)者-消費(fèi)者模式:用于在生產(chǎn)者和消費(fèi)者之間進(jìn)行線程安全的數(shù)據(jù)交換。
  2. 任務(wù)調(diào)度:用于實(shí)現(xiàn)線程池中的任務(wù)隊(duì)列,控制任務(wù)的提交和執(zhí)行。
  3. 數(shù)據(jù)傳輸:用于在不同線程之間傳遞數(shù)據(jù),例如在生產(chǎn)者和消費(fèi)者之間傳遞數(shù)據(jù)。
  4. 事件驅(qū)動編程:用于在事件處理中進(jìn)行線程間通信和協(xié)調(diào)。
  5. 限流和流量控制:用于控制系統(tǒng)的并發(fā)訪問量,防止系統(tǒng)過載。

阻塞隊(duì)列(BlockingQueue)

2、個(gè)人理解

  • 阻塞隊(duì)列之所以叫阻塞隊(duì)列,是因?yàn)樗梢栽谔砑踊蛘攉@取元素的時(shí)候阻塞添加或獲取的線程。直到線程達(dá)到自己的目的。
  • 阻塞隊(duì)列之所以被稱為阻塞隊(duì)列,是因?yàn)楫?dāng)隊(duì)列已滿時(shí),嘗試向隊(duì)列中添加元素的線程會被阻塞,直到隊(duì)列有空間為止;當(dāng)隊(duì)列為空時(shí),嘗試從隊(duì)列中獲取元素的線程會被阻塞,直到隊(duì)列中有元素為止。這種行為可以確保線程安全地在隊(duì)列中添加或獲取元素。

四、參考:

阻塞隊(duì)列(BlockingQueue)文章來源地址http://www.zghlxwxcb.cn/news/detail-777099.html

  • 雙端隊(duì)列,其他隊(duì)列感興趣的,可以見下面:
    1、 或 這里
    2、 或 這里
    3、 或 這里
    4、https://blog.51cto.com/u_16099200/7290591

到了這里,關(guān)于阻塞隊(duì)列(BlockingQueue)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 什么是Java中的阻塞隊(duì)列和非阻塞隊(duì)列?

    首先,讓我們從基礎(chǔ)概念開始。在計(jì)算機(jī)科學(xué)中,數(shù)據(jù)結(jié)構(gòu)可以分為兩種:隊(duì)列和管道。隊(duì)列是一種先進(jìn)先出(FIFO)的數(shù)據(jù)結(jié)構(gòu),你可以想象成排隊(duì)買電影票的情況。你加入隊(duì)伍的時(shí)候,你可以決定站在哪里,但是一旦決定站在哪里,你就不能改變位置。而一旦你到達(dá)隊(duì)尾,

    2024年02月14日
    瀏覽(33)
  • 【數(shù)據(jù)結(jié)構(gòu)-隊(duì)列】阻塞隊(duì)列

    【數(shù)據(jù)結(jié)構(gòu)-隊(duì)列】阻塞隊(duì)列

    ??????歡迎來到我的博客,很高興能夠在這里和您見面!希望您在這里可以感受到一份輕松愉快的氛圍,不僅可以獲得有趣的內(nèi)容和知識,也可以暢所欲言、分享您的想法和見解。 推薦:kuan 的首頁,持續(xù)學(xué)習(xí),不斷總結(jié),共同進(jìn)步,活到老學(xué)到老 導(dǎo)航 檀越劍指大廠系列:全面總

    2024年02月09日
    瀏覽(25)
  • 阻塞隊(duì)列(消息隊(duì)列)

    阻塞隊(duì)列(消息隊(duì)列)

    隊(duì)列是一種先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu)。而阻塞隊(duì)列也是一種特殊的隊(duì)列,也遵守”先進(jìn)先出“的原則。 阻塞隊(duì)列是一種線程安全的的數(shù)據(jù)結(jié)構(gòu),并且具有以下 特性 : 1、隊(duì)列往進(jìn)寫元素是從隊(duì)尾插入,隊(duì)首取出 2、當(dāng)插入元素的時(shí)候,先判斷一下,隊(duì)列是否已經(jīng)滿了,如果滿了就

    2024年02月11日
    瀏覽(14)
  • 阻塞隊(duì)列(JAVA)

    阻塞隊(duì)列(JAVA)

    阻塞隊(duì)列是一種特殊的隊(duì)列,也遵守 \\\"先進(jìn)先出\\\" 的原則。 阻塞隊(duì)列能是一種 線程安全的數(shù)據(jù)結(jié)構(gòu) , 并且具有以下特性: 當(dāng)隊(duì)列滿的時(shí)候, 繼續(xù)入隊(duì)列就會阻塞, 直到有其他線程從隊(duì)列中取走元素; 當(dāng)隊(duì)列空的時(shí)候, 繼續(xù)出隊(duì)列也會阻塞, 直到有其他線程往隊(duì)列中插入元素。 ?

    2024年02月02日
    瀏覽(18)
  • 阻塞隊(duì)列的原理及應(yīng)用

    阻塞隊(duì)列的原理及應(yīng)用

    阻塞隊(duì)列是一種常用的并發(fā)編程工具,它能夠在多線程環(huán)境下提供一種安全而高效的數(shù)據(jù)傳輸機(jī)制。本文將介紹阻塞隊(duì)列的原理和使用場景,并通過實(shí)例演示其在多線程編程中的應(yīng)用。 阻塞隊(duì)列是一種特殊的隊(duì)列,它具有以下幾個(gè)特點(diǎn): 阻塞特性:當(dāng)隊(duì)列為空時(shí),從隊(duì)列中

    2024年02月10日
    瀏覽(14)
  • 阻塞隊(duì)列是什么

    阻塞隊(duì)列是什么

    (1) 棧與隊(duì)列 1)棧:先進(jìn)后出,后進(jìn)先出 2)隊(duì)列:先進(jìn)先出 (2) 阻塞隊(duì)列 阻塞:必須要阻塞/不得不阻塞 阻塞隊(duì)列是一個(gè)隊(duì)列,在數(shù)據(jù)結(jié)構(gòu)中起的作用如下圖: 1)當(dāng)隊(duì)列是空的,從隊(duì)列中獲取元素的操作將會被阻塞。 2)當(dāng)隊(duì)列是滿的,從隊(duì)列中添加元素的操作將會被阻塞

    2024年02月13日
    瀏覽(15)
  • 10.阻塞隊(duì)列和線程池

    阻塞隊(duì)列(BlockQueue) 非阻塞方法 add 往滿的隊(duì)列中添加元素會報(bào)錯(cuò) remove 從空的隊(duì)列中移除元素會報(bào)錯(cuò) offer 往滿的隊(duì)列中添加元素會返回false poll 從空的隊(duì)列中移除元素會返回null 阻塞方法 put take 使用場景: 阻塞隊(duì)列通常使用在生產(chǎn)者消費(fèi)者設(shè)計(jì)模式當(dāng)中,生產(chǎn)者不用關(guān)心生成的

    2024年02月04日
    瀏覽(19)
  • 阻塞隊(duì)列.

    阻塞隊(duì)列.

    目錄 ?什么是阻塞隊(duì)列 ?什么是生產(chǎn)-消費(fèi)者模式 ?實(shí)現(xiàn)一個(gè)阻塞隊(duì)列 ?BlockingQueue 阻塞隊(duì)列是一種特殊的隊(duì)列,它除了具備隊(duì)列的先進(jìn)先出的特點(diǎn)外,還具有以下特點(diǎn): ?. 如果隊(duì)列為空時(shí),執(zhí)行出隊(duì)列操作,會阻塞等待,直到另一個(gè)線程往隊(duì)列里添加元素(隊(duì)列不為空)

    2024年02月08日
    瀏覽(16)
  • Qt QQueue 安全的多線程隊(duì)列、阻塞隊(duì)列

    Qt QQueue 安全的多線程隊(duì)列、阻塞隊(duì)列

    在C++中,queue是一個(gè)模板類,用于實(shí)現(xiàn)隊(duì)列數(shù)據(jù)結(jié)構(gòu),遵循先進(jìn)先出的原則。 ? 常用方法: · ? 簡單使用: · ? 打?。?· QQueue 繼承與 QList ? 常用方法: · ? 實(shí)例: · ? 打?。?· 在多線程編程中,由于QQueue并不是線程安全的,因此我們需要先使用互斥鎖(QMutex)來保

    2024年02月16日
    瀏覽(23)
  • 【Linux驅(qū)動】Linux阻塞IO —— 阻塞讀取按鍵狀態(tài)(等待隊(duì)列實(shí)現(xiàn))

    【Linux驅(qū)動】Linux阻塞IO —— 阻塞讀取按鍵狀態(tài)(等待隊(duì)列實(shí)現(xiàn))

    上一節(jié)獲取按鍵狀態(tài)時(shí),是在應(yīng)用層以循環(huán)的方式不斷讀取按鍵狀態(tài),但是我們實(shí)際關(guān)注的只是當(dāng)按鍵被按下時(shí)發(fā)生的情況,所以大多數(shù)時(shí)間拿到的狀態(tài)都是我們不需要的結(jié)果。 對此,當(dāng)按鍵被釋放時(shí),讓 read 接口處于阻塞狀態(tài),等按鍵被按下再解除阻塞。 要使用等待隊(duì)列

    2024年02月02日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包