成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試官:阻塞隊列有了解過嗎?

開發 后端
?下面我們就一起看一下Java中給我們提供了哪些好用的工具,先給大家介紹一下BlockingQueue, 本節我們主要講它的用法。

前言

本節就一起探討一下什么是阻塞隊列,一起來看下吧!

什么是阻塞隊列

我們先說一下為什么要引入阻塞隊列。我們知道服務器的資源是有限的,就拿典型的生產者和消費者模型來講。

消費者如果沒有東西可以消費了,但是它還是在一直執行,這無疑是在浪費系統資源,所以我們需要阻塞消費者,換過來同理。

生產者沒有東西可生產了或者說沒有地方存儲它生產的東西,這時候我們就需要阻塞生產者。

然而,在開發中,這種模型往往運行在多線程環境中,需要對資源共享從而達到更高的性能,但這樣也會造成線程安全問題,比如死鎖、重復消費 所以阻塞隊列就是幫我們解決這些問題的。

BlockingQueue

下面我們就一起看一下Java中給我們提供了哪些好用的工具,先給大家介紹一下BlockingQueue, 本節我們主要講它的用法。

BlockingQueue是Java util.concurrent包下的類,BlockingQueue提供了「線程安全的隊列訪問方式」,并發包下很多高級同步類的實現都是基于BlockingQueue實現的。

BlockingQueue一般用于生產者-消費者模式,生產者是往隊列里添加元素的線程,消費者是從隊列里拿元素的線程。「BlockingQueue就是存放元素的容器」。

public interface BlockingQueue<E> extends Queue<E> {....}

它本身是一個接口,我們看下它常用的實現類。

ArrayBlockingQueue

一個用數組實現的有界阻塞隊列,此隊列按照先進先出(FIFO)的原則對元素進行排序, 支持公平鎖和非公平鎖。

  • add() 添加元素。
// 初始化 容量為3
BlockingQueue<String> queue = new ArrayBlockingQueue<>(3);
System.out.println(queue.add("1"));
System.out.println(queue.add("2"));
System.out.println(queue.add("3"));
System.out.println(queue.add("4"));

我們發現添加到4的時候,報錯了Exception in thread "main" java.lang.IllegalStateException: Queue full。

  • remove() 移除元素,如果為空,會返回異常。
// 初始化 容量為3
BlockingQueue<String> queue = new ArrayBlockingQueue<>(3);
System.out.println(queue.add("1"));
System.out.println(queue.add("2"));
System.out.println(queue.add("3"));
// System.out.println(queue.add("4"));
System.out.println(queue.remove());
System.out.println(queue);

打印:

true
true
true
1
[2, 3]

從結果來看,符合FIFO規則,如果我想移除指定元素怎么辦呢?很簡單,使用remove("3")。

  • offer() 和add方法類似,但是它不會報錯,它會返回false, offer(e,time,unit)支持超時。
BlockingQueue<String> queue = new ArrayBlockingQueue<>(3);
System.out.println(queue.offer("1"));
System.out.println(queue.offer("2"));
System.out.println(queue.offer("3"));
System.out.println(queue.offer("4"));
true
true
true
false
  • poll() 與remove相似,但它不會返回異常而是返回null, poll(time,unit)。
BlockingQueue<String> queue = new ArrayBlockingQueue<>(3);
System.out.println(queue.poll());
null
  • take() 與 poll類似, 但它會造成線程阻塞。
public static void main(String[] args) throws InterruptedException {
BlockingQueue<String> queue = new ArrayBlockingQueue<>(3);
System.out.println(queue.take());
}

運行后,我們發現程序被阻塞了。

  • put() 添加元素,當容器滿的時候,會造成線程阻塞。
public static void main(String[] args) throws InterruptedException {
BlockingQueue<String> queue = new ArrayBlockingQueue<>(1);
queue.put("1");
queue.put("2");
}

運行后發現,執行到2的時候被阻塞了。

以上是它的常用方法,其它的實現類就不一一給大家演示了,方法差不多,都是基于BlockingQueue接口,可以自己試著運行一下看看。

LinkedBlockingQueue

一個由鏈表結構組成的有界隊列,此隊列的長度為Integer.MAX_VALUE。

SynchronousQueue

是一個不存儲元素的阻塞隊列,每一個put操作必須等待take操作,否則不能添加元素。支持公平鎖和非公平鎖。SynchronousQueue的一個使用場景是在線程池里。Executors.newCachedThreadPool()就使用了SynchronousQueue,這個上節我們講線程復用的時候遇到過。

LinkedTransferQueue

是一個由鏈表結構組成的無界阻塞隊列,相當于其它隊列,LinkedTransferQueue隊列多了transfer和tryTransfer方法。

PriorityBlockingQueue

是一個支持線程優先級排序的無界隊列,默認自然序進行排序,也可以自定義實現compareTo()方法來指定元素排序規則,不能保證同優先級元素的順序。

DelayQueue

一個實現PriorityBlockingQueue實現延遲獲取的無界隊列,在創建元素時,可以指定多久才能從隊列中獲取當前元素。只有延時期滿后才能從隊列中獲取元素,在緩存設計和定時任務調度中經常會遇到。

結束語

本節主要給大家介紹了常用的阻塞隊列以及它的基本使用。

責任編輯:姜華 來源: 今日頭條
相關推薦

2022-06-30 14:31:57

Java阻塞隊列

2022-07-26 08:40:42

Java并發工具類

2022-08-02 06:31:32

Java并發工具類

2022-07-11 10:47:46

容器JAVA

2022-06-10 13:56:42

Java

2022-07-18 14:18:26

Babel代碼面試

2022-06-15 15:14:17

Java公平鎖非公平鎖

2022-06-08 13:54:23

指令重排Java

2022-06-09 11:20:44

volatile關鍵字

2021-04-12 21:34:29

Redis故障數據

2022-06-24 06:43:57

線程池線程復用

2020-09-26 22:04:32

數據安全傳輸HTTPSHTTP 協議

2024-09-03 07:58:46

2025-02-19 00:00:00

RabbitMQTTL插件

2024-01-26 13:16:00

RabbitMQ延遲隊列docker

2020-10-08 14:15:15

Zookeeper

2019-12-25 11:22:19

負載均衡集群算法

2023-09-26 07:49:11

AOP代理spring

2024-09-09 08:30:56

代碼

2025-04-02 01:20:00

阻塞隊列源碼
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 免费午夜电影 | 羞羞的视频免费观看 | 精品一二区 | 二区成人 | 国产欧美一区二区三区日本久久久 | www.久久久久久久久久久久 | 中文字幕中文字幕 | avav在线看| av入口| 777毛片| 国产日韩久久 | 网页av| 精品一区av | 久久久久久久国产 | 国产区视频在线观看 | 久久久久久91香蕉国产 | 亚洲久久在线 | 黄色一级大片在线观看 | 欧美一区二区三区四区视频 | 亚洲狠狠爱 | 久久精品女人天堂av | 国产99久久久国产精品下药 | 男女精品久久 | 国产一区二区三区www | 四虎永久在线精品免费一区二 | 一区二区三区视频 | 国产午夜av片 | 日本三级全黄三级a | 国产精品视频一 | 最近中文字幕在线视频1 | 午夜影院在线观看 | 中文字幕日韩一区 | 精品国产三级 | 一区二区小视频 | 色妞av| 亚洲精品二区 | 国产在线精品一区二区 | 先锋资源吧 | 日韩性在线 | 久久久国产一区二区三区四区小说 | 天天爽夜夜爽精品视频婷婷 |