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

您的位置:首頁技術(shù)文章
文章詳情頁

Java實現(xiàn)自定義阻塞隊列

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

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

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

1.新建一個 MyQueue.java 類

import java.util.LinkedList;import java.util.concurrent.atomic.AtomicInteger;import com.xiaoleilu.hutool.util.StrUtil;/** * 使用 notify() 和 wait() 實現(xiàn)自定義阻塞隊列 * * @author Yangkai.Shen * @version 1.0 * @date 2017.08.02 at 11:51:14 */public class MyQueue {// 1. 承載數(shù)據(jù)的容器private LinkedList<Object> queue = new LinkedList<Object>();// 2. 計數(shù)器,用于判定邊界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;}/** * 添加一個元素到隊列中,如果隊列元素已滿,則調(diào)用此方法的線程被阻塞,直到存在多余空間了,再進(jìn)行添加 * * @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.計數(shù)器累加count.incrementAndGet();System.out.println(StrUtil.format('新加入的元素為:{}', obj));// 4.喚醒其他線程(若本來元素為空,有線程調(diào)用 get 方法,那么原本被阻塞的,需要在此時被喚醒)lock.notify();}}/** * 獲取一個元素,如果隊列元素為空,則調(diào)用此方法的線程被阻塞,直到添加新元素了,再進(jìn)行獲取 * * @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.計數(shù)器遞減count.decrementAndGet();System.out.println(StrUtil.format('移除的元素為:{}', ret));// 4.喚醒其他線程(若元素本來已滿,有線程調(diào)用 put 方法,那么原本被阻塞的,需要在此時被喚醒)lock.notify();}return ret;}public int getSize() {return this.count.get();}}

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

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('當(dāng)前隊列的長度: {}', 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.啟動測試類,查看運行結(jié)果。控制臺如果應(yīng)該出現(xiàn)的效果是,隊列先初始化完成,然后休眠 2s,接下來先取數(shù)據(jù),再插入數(shù)據(jù),則證明阻塞隊列生效。下面是控制臺運行的效果:

初始化隊列

Java實現(xiàn)自定義阻塞隊列

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

Java實現(xiàn)自定義阻塞隊列

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

4.至此,一個自定義阻塞隊列就已經(jīng)實現(xiàn)了。

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

以上就是Java實現(xiàn)自定義阻塞隊列的詳細(xì)內(nèi)容,更多關(guān)于Java 自定義阻塞隊列的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产美女久久| 91亚洲自偷观看高清| 色偷偷色偷偷色偷偷在线视频| 嫩草伊人久久精品少妇av杨幂| 精品中文字幕一区二区三区| 免费在线小视频| 精品1区2区3区4区| 欧美在线亚洲综合一区| 久久夜色精品| 欧美黄色精品| 久久久影院免费| 亚洲一区二区日韩| 国产亚洲高清一区| 正在播放日韩精品| 国产视频一区免费看| 香蕉久久一区| 国产a亚洲精品| 亚洲欧洲一区| 国产精久久久| 欧美肉体xxxx裸体137大胆| 免费在线观看视频一区| 国产精品欧美一区二区三区不卡| 国产精品久久| 在线成人直播| 欧美黑人做爰爽爽爽| 极品日韩av| 国产精品免费不| 激情偷拍久久| 国产精品videossex| 成人久久久久| 日韩黄色免费网站| 日韩 欧美一区二区三区| 日本欧美在线| 日韩欧美不卡| 日本精品一区二区三区在线观看视频| 国产一区二区三区亚洲| 免费国产自线拍一欧美视频| 日韩精选在线| 亚洲四虎影院| 国产日韩亚洲欧美精品| 激情欧美一区| 九九久久国产| 亚洲三级av| 激情综合亚洲| 欧美a在线观看| 人人精品人人爱| 欧美成人a交片免费看| 日本99精品| 欧美在线亚洲综合一区| 麻豆国产欧美日韩综合精品二区| 自由日本语亚洲人高潮| 精品国内亚洲2022精品成人| 亚洲大片在线| 另类欧美日韩国产在线| 国产精品色网| 欧美13videosex性极品| 国产精品久久久久久久久久久久久久久 | 欧洲av一区二区| 日韩高清成人在线| 影音国产精品| 久久天堂av| 国产精品99一区二区三区| 日韩区一区二| 国产一区91| 激情欧美一区| 日韩中文在线电影| 久久gogo国模啪啪裸体| 中文字幕免费一区二区| 欧美 日韩 国产精品免费观看| 精品国产乱码久久久久久1区2匹| 日韩超碰人人爽人人做人人添| 亚洲特级毛片| 三级小说欧洲区亚洲区| 国产传媒在线观看| 精品视频自拍| 免费一级欧美片在线观看网站| 欧美日韩91| 日韩精品一区二区三区av | 精精国产xxxx视频在线野外| 国产精品色在线网站| 亚洲97av| 五月亚洲婷婷 | 精品久久电影| 精品视频一区二区三区四区五区| 国产精品亚洲片在线播放| 日韩av中文在线观看| 亚洲毛片在线免费| 亚洲精品系列| 奇米亚洲欧美| 国产精品亚洲综合久久| 欧美交a欧美精品喷水| 蜜桃久久久久| 精品伊人久久| 国产黄大片在线观看| 黑人精品一区| 正在播放日韩精品| 欧美成人基地| 宅男在线一区| 亚洲视频二区| 日本aⅴ免费视频一区二区三区| 欧美片第1页综合| 国产激情综合| 国产精品精品国产一区二区| 国产盗摄——sm在线视频| 欧美少妇精品| 亚洲激情精品| 日本麻豆一区二区三区视频| 国产精品777777在线播放| 精品入口麻豆88视频| 伊人久久国产| 亚洲精品99| 在线观看亚洲精品福利片| 日韩精品电影一区亚洲| 国产精品网址| 日韩欧美一区二区三区在线视频| 欧美中文字幕一区二区| 蜜臀av在线播放一区二区三区| 日本精品国产| 福利在线免费视频| 黄色av日韩| 国产日韩欧美高清免费| 福利欧美精品在线| 在线成人直播| 国产日韩欧美一区在线| av资源中文在线天堂| 欧美中文一区二区| 一区二区三区国产在线| 久久国产精品美女| 久久精品亚洲人成影院| 亚洲欧美专区| 中文在线免费视频| 亚洲在线免费| 国产精品jk白丝蜜臀av小说| 日韩成人综合| 三级久久三级久久久| 精品欧美日韩精品| 99国产精品视频免费观看一公开| 日韩av一区二| 99久久精品网| 欧美精品三级在线| 欧美日韩视频免费观看| 蜜桃av一区二区三区电影| 日韩免费小视频| 日韩福利一区| 蜜臀久久99精品久久久久久9| 国产欧美一区二区三区精品观看 | 亚欧成人精品| 欧美日韩视频网站| 日本不卡一区二区三区| 正在播放日韩精品| 亚洲另类av| 亚洲精品成人图区| 亚洲精品在线a| 久久久蜜桃一区二区人| 老牛国产精品一区的观看方式| 国产精品激情电影| 在线亚洲国产精品网站| 国内自拍视频一区二区三区| 亚洲一区不卡| 国产精品伦理久久久久久| 亚洲tv在线| 午夜国产精品视频免费体验区| 国产精品v亚洲精品v日韩精品| 亚洲三级网址| 国产成人1区| 日韩一区二区三区四区五区| 久久久噜噜噜| 精品美女在线视频| 日韩一区精品| 亚洲欧洲高清| 国产欧美日韩精品一区二区三区| 99在线精品免费视频九九视| 成人亚洲一区二区| 国产精品久久久久久模特| 在线免费观看亚洲| 黄色日韩在线| 99热精品久久| 精品美女视频| 国产精品99久久免费| 免费在线看一区| 久久精品高清| 亚洲综合电影| 精品国内亚洲2022精品成人| 奇米色欧美一区二区三区| 黄色免费成人| 久久国产毛片| 欧洲一区二区三区精品| 加勒比视频一区| 美女高潮久久久| 国产精品伦一区二区| 日韩区欧美区| 91伊人久久| 日韩av资源网| 日韩va亚洲va欧美va久久| 日韩三级视频| 日韩av网站在线免费观看| 亚洲欧洲美洲国产香蕉| 视频一区欧美日韩| 国产精品美女久久久| 欧美91精品|