日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Java實現自定義阻塞隊列

瀏覽:101日期:2022-08-22 18:09:39

今天重溫了下 java 多線程中的 notify() 方法以及 wait() 方法,一時興起,決定通過這倆個方法,實現一個簡易的自定義阻塞隊列。

阻塞隊列是什么,與普通隊列的區別是什么?阻塞隊列與普通隊列的區別在于,當隊列是空的時,從隊列中獲取元素的操作將會被阻塞,或者當隊列是滿時,往隊列里添加元素的操作會被阻塞。試圖從空的阻塞隊列中獲取元素的線程將會被阻塞,直到其他的線程往空的隊列插入新的元素。同樣,試圖往已滿的阻塞隊列中添加新元素的線程同樣也會被阻塞,直到其他的線程使隊列重新變得空閑起來。

1.新建一個 MyQueue.java 類

import java.util.LinkedList;import java.util.concurrent.atomic.AtomicInteger;import com.xiaoleilu.hutool.util.StrUtil;/** * 使用 notify() 和 wait() 實現自定義阻塞隊列 * * @author Yangkai.Shen * @version 1.0 * @date 2017.08.02 at 11:51:14 */public class MyQueue {// 1. 承載數據的容器private LinkedList<Object> queue = new LinkedList<Object>();// 2. 計數器,用于判定邊界private AtomicInteger count = new AtomicInteger(0);private final int minSize = 0;// 3. 初始化一個對象,用于加鎖private final Object lock = new Object();private final int maxSize;public MyQueue(int maxSize) {this.maxSize = maxSize;}/** * 添加一個元素到隊列中,如果隊列元素已滿,則調用此方法的線程被阻塞,直到存在多余空間了,再進行添加 * * @param obj 添加 obj 到隊列尾部 */public void put(Object obj) {synchronized (lock) {// 1.沒有多余空間,就阻塞線程while (count.get() == this.maxSize) {try {lock.wait();} catch (InterruptedException e) {e.printStackTrace();}}// 2.添加元素queue.add(obj);// 3.計數器累加count.incrementAndGet();System.out.println(StrUtil.format('新加入的元素為:{}', obj));// 4.喚醒其他線程(若本來元素為空,有線程調用 get 方法,那么原本被阻塞的,需要在此時被喚醒)lock.notify();}}/** * 獲取一個元素,如果隊列元素為空,則調用此方法的線程被阻塞,直到添加新元素了,再進行獲取 * * @return 返回隊列的第一個元素 */public Object get() {Object ret = null;synchronized (lock) {// 1.沒有元素,就阻塞線程while (count.get() == this.minSize) {try {lock.wait();} catch (InterruptedException e) {e.printStackTrace();}}// 2.取第一個元素ret = queue.removeFirst();// 3.計數器遞減count.decrementAndGet();System.out.println(StrUtil.format('移除的元素為:{}', ret));// 4.喚醒其他線程(若元素本來已滿,有線程調用 put 方法,那么原本被阻塞的,需要在此時被喚醒)lock.notify();}return ret;}public int getSize() {return this.count.get();}}

2.新建一個測試類 MyQueueTest.java,測試類中,我們初始化一個隊列,并將元素填滿,然后啟動一個線程 t1,去插入數據,中間休眠 2s,再去啟動一個線程 t2 取數據。

import com.xiaoleilu.hutool.util.StrUtil;import java.util.concurrent.TimeUnit;public class MyQueueTest {public static void main(String[] args) {final MyQueue queue = new MyQueue(5);queue.put('a');queue.put('b');queue.put('c');queue.put('d');queue.put('e');System.out.println(StrUtil.format('當前隊列的長度: {}', queue.getSize()));Thread t1 = new Thread(() -> {queue.put('f');queue.put('g');queue.put('h');}, 't1'); Thread t2 = new Thread(() -> { queue.get(); queue.get(); }); t1.start(); try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); } t2.start();}

3.啟動測試類,查看運行結果。控制臺如果應該出現的效果是,隊列先初始化完成,然后休眠 2s,接下來先取數據,再插入數據,則證明阻塞隊列生效。下面是控制臺運行的效果:

初始化隊列

Java實現自定義阻塞隊列

休眠 2s 后取隊首元素,再插入隊尾元素

Java實現自定義阻塞隊列

此時我們會發現,程序還未停止,因為此時隊列已滿,但是線程 t1 還未插入 h 元素,因此線程被阻塞著,直至下次隊列有空余空間才會被喚醒。

4.至此,一個自定義阻塞隊列就已經實現了。

5.細心的朋友會發現,我打印的 log 里用到了一個 StrUtil.format() 方法,這個和 slf4j 的 log 用法一致,可以使用占位符。這個是用到了一個國產良心工具類,hutool,國產開源,需要大家的支持,覺得好用的話,期望可以去 碼云 或者 github 上給個 Star 吧!

以上就是Java實現自定義阻塞隊列的詳細內容,更多關于Java 自定義阻塞隊列的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日本va欧美va瓶| 日韩动漫一区| 私拍精品福利视频在线一区| 日韩国产综合| 欧美精品九九| 日韩激情视频网站| 欧美日韩午夜电影网| 日本а中文在线天堂| 男人操女人的视频在线观看欧美| 国产精品天堂蜜av在线播放| 日韩久久精品| 日韩和欧美一区二区三区| 中文字幕在线免费观看视频| 精品午夜视频| 欧美日韩免费观看视频| 亚洲精品在线a| 成人国产综合| 亚洲美女久久| 激情丁香综合| 牛牛精品成人免费视频| 亚洲美洲欧洲综合国产一区| 亚洲视频二区| 成人午夜网址| 午夜亚洲福利| 2023国产精品久久久精品双| 国产一区二区三区不卡av| 狠狠干成人综合网| 久久gogo国模啪啪裸体| 亚洲精品伊人| 亚洲最新无码中文字幕久久| 日韩精品亚洲专区| 欧美性感美女一区二区| 国产成人精品亚洲线观看| 亚洲精品三级| 国产毛片一区| 99久久精品网| 欧美日韩精品一区二区三区视频| 欧美日韩四区| 色婷婷久久久| 奇米狠狠一区二区三区| 日韩精品福利一区二区三区| 亚洲尤物av| 国产精品婷婷| 激情综合网站| 日韩国产欧美一区二区| 深夜福利一区| 青青久久av| 久久婷婷国产| 欧美一区二区三区久久| 亚洲精品自拍| 人人爽香蕉精品| 成人在线视频免费| 久久gogo国模啪啪裸体| 日本三级亚洲精品| 亚洲在线国产日韩欧美| 国产一区二区三区91| 日韩在线黄色| 日韩精品欧美成人高清一区二区| 石原莉奈在线亚洲三区| 国产亚洲网站| 黄色成人精品网站| 99精品99| 亚洲综合日韩| 亚洲一区二区免费看| 欧美日韩少妇| 国产精品99久久免费观看| 蜜桃视频第一区免费观看| 水蜜桃久久夜色精品一区| 亚洲人亚洲人色久| 欧美一区二区三区高清视频| 国产精品日韩精品中文字幕| 国产精品视区| 欧美日韩视频网站| 青青国产精品| 视频一区视频二区中文字幕| 蜜桃av在线播放| 久久精品系列| 国产精品一区亚洲| 亚洲一区二区三区高清| 亚洲一级二级| 日韩欧美一区二区三区免费观看| 国产偷自视频区视频一区二区| 亚洲1234区| sm捆绑调教国产免费网站在线观看| 视频一区二区三区在线| 成人在线视频免费看| 蜜桃免费网站一区二区三区| 精品国产免费人成网站| 国产麻豆精品| 亚洲九九精品| 亚洲欧美日本国产专区一区| 久久青草久久| 国产精品伦理久久久久久| 欧美精品二区| 国产亚洲精aa在线看| 亚洲精品系列| 亚洲网站视频| 久久99偷拍| 久久精品97| 日韩免费精品| 不卡视频在线| 99精品视频精品精品视频| 欧美aaaaaa午夜精品| 亚洲一区二区三区中文字幕在线观看| 久久久影院免费| 欧美国产美女| 精品一区二区三区在线观看视频| 亚洲va久久久噜噜噜久久| 亚洲啊v在线| 久久精品五月| 欧美日韩午夜| 最新国产精品| 在线午夜精品| 久久国产精品成人免费观看的软件| 欧美色图一区| 成人羞羞视频播放网站| 999国产精品| 日韩中文首页| 中文在线а√天堂| 999久久久国产精品| 国产盗摄——sm在线视频| 日韩av一级| 夜鲁夜鲁夜鲁视频在线播放| 成人一区而且| 99精品综合| 999国产精品永久免费视频app| 国产欧美另类| 久久精品国产999大香线蕉| 九九久久国产| 九九精品调教| 久久91导航| 999国产精品| 麻豆亚洲精品| 国产亚洲精品久久久久婷婷瑜伽| 亚洲另类av| 五月国产精品| 国产精品一国产精品| 欧美一区免费| 精品九九在线| 成人影视亚洲图片在线| 2023国产精品久久久精品双| 日韩电影免费在线观看| 国产精品亚洲一区二区三区在线观看| 国产伊人精品| 午夜一区在线| 欧美日本久久| 精品一区视频| 91欧美在线| 久久夜色精品| 日本午夜精品视频在线观看| 精品欧美视频| 亚洲一级少妇| 亚洲少妇诱惑| 国产极品久久久久久久久波多结野 | 亚洲成人一区| 欧美综合国产| 久久久久久夜| 黄色日韩在线| 免费精品视频最新在线| 国内不卡的一区二区三区中文字幕| 高清久久精品| 日韩一区二区三区免费视频 | 亚洲2区在线| 香蕉成人av| 免费欧美在线视频| 精品国产成人| 在线一区二区三区视频| 麻豆精品久久久| 久久精品国语| 综合一区在线| 最新中文字幕在线播放 | 日韩在线网址| 91精品亚洲| 日韩成人一级| 九九久久电影| 麻豆免费精品视频| 亚洲激情av| 成人欧美一区二区三区的电影| 首页国产欧美日韩丝袜| 久久久久久久久99精品大| 亚洲经典在线| 欧美激情福利| 日本欧美在线| 国产一区亚洲| 91精品xxx在线观看| 国产欧美一区二区精品久久久 | 日韩在线免费| 久久精品xxxxx| 99精品视频在线| 捆绑调教日本一区二区三区| 亚洲一区av| 肉色欧美久久久久久久免费看 | 欧美一区=区三区| 国产一区久久| 国产精品第一| 91精品啪在线观看国产爱臀| 99精品在线| 国产一区一一区高清不卡| 日韩国产欧美视频| 婷婷丁香综合|