电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

Java實現自定義阻塞隊列

瀏覽:41日期: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
相關文章:
主站蜘蛛池模板: 旋转气浴恒温振荡器-往复式水浴恒温振荡器-金怡百科 | 天津拓展_天津团建_天津趣味运动会_天津活动策划公司-天津华天拓展培训中心 | 广东西屋电气有限公司-广东西屋电气有限公司 | 环氧树脂地坪漆_济宁市新天地漆业有限公司 | 热缩管切管机-超声波切带机-织带切带机-无纺布切布机-深圳市宸兴业科技有限公司 | 安驭邦官网-双向万能直角铣头,加工中心侧铣头,角度头[厂家直销] 闸阀_截止阀_止回阀「生产厂家」-上海卡比阀门有限公司 | 波纹补偿器_不锈钢波纹补偿器_巩义市润达管道设备制造有限公司 | 亮点云建站-网站建设制作平台 | 吲哚菁绿衍生物-酶底物法大肠菌群检测试剂-北京和信同通科技发展有限公司 | 智能电表|预付费ic卡水电表|nb智能无线远传载波电表-福建百悦信息科技有限公司 | 首页_欧瑞传动官方网站--主营变频器、伺服系统、新能源、软起动器、PLC、HMI | 上海律师事务所_上海刑事律师免费咨询平台-煊宏律师事务所 | 发电机价格|发电机组价格|柴油发电机价格|柴油发电机组价格网 | 高精度电阻回路测试仪-回路直流电阻测试仪-武汉特高压电力科技有限公司 | 污泥烘干机-低温干化机-工业污泥烘干设备厂家-焦作市真节能环保设备科技有限公司 | 沥青车辙成型机-车托式混凝土取芯机-混凝土塑料试模|鑫高仪器 | 河南档案架,档案密集架,手动密集架,河南密集架批发/报价 | 美侍宠物-专注宠物狗及宠物猫训练|喂养|医疗|繁育|品种|价格 | 酒吧霸屏软件_酒吧霸屏系统,酒吧微上墙,夜场霸屏软件,酒吧点歌软件,酒吧互动游戏,酒吧大屏幕软件系统下载 | 高扬程排污泵_隔膜泵_磁力泵_节能自吸离心水泵厂家-【上海博洋】 | 压装机-卧式轴承轮轴数控伺服压装机厂家[铭泽机械] | 有机废气处理-rto焚烧炉-催化燃烧设备-VOC冷凝回收装置-三梯环境 | 手机存放柜,超市储物柜,电子储物柜,自动寄存柜,行李寄存柜,自动存包柜,条码存包柜-上海天琪实业有限公司 | 工作心得_读书心得_学习心得_找心得体会范文就上学道文库 | 浙江栓钉_焊钉_剪力钉厂家批发_杭州八建五金制造有限公司 | 综合管廊模具_生态,阶梯护坡模具_检查井模具制造-致宏模具厂家 | 课件导航网_ppt课件_课件模板_课件下载_最新课件资源分享发布平台 | 岩石钻裂机-液压凿岩机-劈裂机-挖改钻_湖南烈岩科技有限公司 | 开业庆典_舞龙舞狮_乔迁奠基仪式_开工仪式-神挚龙狮鼓乐文化传媒 | 三佳互联一站式网站建设服务|网站开发|网站设计|网站搭建服务商 赛默飞Thermo veritiproPCR仪|ProFlex3 x 32PCR系统|Countess3细胞计数仪|371|3111二氧化碳培养箱|Mirco17R|Mirco21R离心机|仟诺生物 | 集菌仪_智能集菌仪_全封闭集菌仪_无菌检查集菌仪厂家-那艾 | 登车桥动力单元-非标液压泵站-非标液压系统-深圳市三好科技有限公司 | 机器视觉检测系统-视觉检测系统-机器视觉系统-ccd检测系统-视觉控制器-视控一体机 -海克易邦 | 广州展览制作|展台制作工厂|展览设计制作|展览展示制作|搭建制作公司 | 衬氟止回阀_衬氟闸阀_衬氟三通球阀_衬四氟阀门_衬氟阀门厂-浙江利尔多阀门有限公司 | 挤出机_橡胶挤出机_塑料挤出机_胶片冷却机-河北伟源橡塑设备有限公司 | elisa试剂盒-PCR试剂盒「上海谷研实业有限公司」 | 永嘉县奥阳陶瓷阀门有限公司 | 郑州爱婴幼师学校_专业幼师培训_托育师培训_幼儿教育培训学校 | 517瓜水果特产网|一个专注特产好物的网站 | 创富网-B2B网站|供求信息网|b2b平台|专业电子商务网站 |