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

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

Java多線程生產者消費者模式實現過程解析

瀏覽:88日期:2022-09-04 10:35:50

單生產者與單消費者

示例:

public class ProduceConsume { public static void main(String[] args) { String lock = new String(''); Produce produce = new Produce(lock); Consume consume = new Consume(lock); new Thread(() -> {while (true) { produce.setValue();} }, 'ProductThread').start(); new Thread(() -> {while (true) { consume.getValue();} }, 'ConsumeThread').start(); } /** * 生產者 */ static class Produce { private String lock; public Produce(String lock) {this.lock = lock; } public void setValue() {try { synchronized (lock) { if (!ValueObject.value.equals('')) { lock.wait(); } String value = System.currentTimeMillis() + '_' + System.nanoTime(); System.out.println('set的值是' + value); ValueObject.value = value; lock.notify(); }} catch (InterruptedException e) { e.printStackTrace();} } } /** * 消費者 */ static class Consume { private String lock; public Consume(String lock) {this.lock = lock; } public void getValue() {try { synchronized (lock) { if (ValueObject.value.equals('')) { lock.wait(); } System.out.println('get的值是' + ValueObject.value); ValueObject.value = ''; lock.notify(); }} catch (InterruptedException e) { e.printStackTrace();} } } static class ValueObject { public static String value = ''; }}

執(zhí)行結果如下:

Java多線程生產者消費者模式實現過程解析

多生產者與多消費者

這種模式下,容易出現“假死”,也就是全部線程都進入了 WAITNG 狀態(tài),程序不在執(zhí)行任何業(yè)務功能了,整個項目呈停止狀態(tài)。

示例:

public class MultiProduceConsume { public static void main(String[] args) throws InterruptedException { String lock = new String(''); Produce produce = new Produce(lock); Consume consume = new Consume(lock); Thread[] pThread = new Thread[2]; Thread[] cThread = new Thread[2]; for (int i = 0; i < 2; i++) { pThread[i] = new Thread(() -> {while (true) { produce.setValue();} }, '生產者' + (i + 1)); cThread[i] = new Thread(() -> {while (true) { consume.getValue();} }, '消費者' + (i + 1)); pThread[i].start(); cThread[i].start(); } Thread.sleep(5000); Thread[] threadArray = new Thread[Thread.currentThread().getThreadGroup().activeCount()]; Thread.currentThread().getThreadGroup().enumerate(threadArray); for (int i = 0; i < threadArray.length; i++) { System.out.println(threadArray[i].getName() + ' ' + threadArray[i].getState()); } } static class Produce { private String lock; public Produce(String lock) { this.lock = lock; } public void setValue() { try {synchronized (lock) { while(!ValueObject.value.equals('')) { System.out.println('生產者 ' + Thread.currentThread().getName() + ' WAITING了⭐'); lock.wait(); } System.out.println('生產者 ' + Thread.currentThread().getName() + ' RUNNABLE了'); String value = System.currentTimeMillis() + '_' + System.nanoTime(); ValueObject.value = value; lock.notify();} } catch (InterruptedException e) {e.printStackTrace(); } } } static class Consume { private String lock; public Consume(String lock) { this.lock = lock; } public void getValue() { try {synchronized (lock) { while (ValueObject.value.equals('')) { System.out.println('消費者 ' + Thread.currentThread().getName() + ' WAITING了⭐'); lock.wait(); } System.out.println('消費者 ' + Thread.currentThread().getName() + 'RUNNABLE了'); ValueObject.value = ''; lock.notify();} } catch (InterruptedException e) {e.printStackTrace(); } } } static class ValueObject { public static String value = ''; }}

運行結果如圖:

Java多線程生產者消費者模式實現過程解析

分析:

雖然代碼中通過 wait/notify 進行通信了,但是不能保證 notify 喚醒的一定是異類,也可能是同類,比如“生產者”喚醒了“生產者”這樣的情況。

解決方案:

假死出現的主要原因是有可能連續(xù)喚醒了同類。所以解決方案很簡單,就是把 notify() 改為 notifyAll() 即可。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
主站蜘蛛池模板: 微信聊天记录恢复_手机短信删除怎么恢复_通讯录恢复软件下载-快易数据恢复 | 彩超机-黑白B超机-便携兽用B超机-多普勒彩超机价格「大为彩超」厂家 | 标策网-专注公司商业知识服务、助力企业发展| 滁州高低温冲击试验箱厂家_安徽高低温试验箱价格|安徽希尔伯特 | 国际船舶网 - 船厂、船舶、造船、船舶设备、航运及海洋工程等相关行业综合信息平台 | 聚氨酯催化剂K15,延迟催化剂SA-1,叔胺延迟催化剂,DBU,二甲基哌嗪,催化剂TMR-2,-聚氨酯催化剂生产厂家 | 老城街小面官网_正宗重庆小面加盟技术培训_特色面馆加盟|牛肉拉面|招商加盟代理费用多少钱 | 精密线材测试仪-电线电缆检测仪-苏州欣硕电子科技有限公司 | 建筑资质代办-建筑企业资质代办机构-建筑资质代办公司 | 蒜肠网-动漫,二次元,COSPLAY,漫展以及收藏型模型,手办,玩具的新媒体.(原变形金刚变迷TF圈) | 无水硫酸铝,硫酸铝厂家-淄博双赢新材料科技有限公司 | 耐热钢-耐磨钢-山东聚金合金钢铸造有限公司 | 螺钉式热电偶_便携式温度传感器_压簧式热电偶|无锡联泰仪表有限公司|首页 | 室内室外厚型|超薄型|非膨胀型钢结构防火涂料_隧道专用防火涂料厂家|电话|价格|批发|施工 | 土壤水分自动监测站-SM150便携式土壤水分仪-铭奥仪器 | 河南生物显微镜,全自动冰冻切片机-河南荣程联合科技有限公司 | 圆窗水平仪|伊莉莎冈特elesa+ganter | 防勒索软件_数据防泄密_Trellix(原McAfee)核心代理商_Trellix(原Fireeye)售后-广州文智信息科技有限公司 | 全自动烧卖机厂家_饺子机_烧麦机价格_小笼汤包机_宁波江北阜欣食品机械有限公司 | 钢格板|热镀锌钢格板|钢格栅板|钢格栅|格栅板-安平县昊泽丝网制品有限公司 | ptc_浴霸_大巴_干衣机_呼吸机_毛巾架_电动车加热器-上海帕克 | 工装定制/做厂家/公司_工装订做/制价格/费用-北京圣达信工装 | 冷凝水循环试验箱-冷凝水试验箱-可编程高低温试验箱厂家-上海巨为(www.juweigroup.com) | 流程管理|流程管理软件|企业流程管理|微宏科技-AlphaFlow_流程管理系统软件服务商 | 宿松新闻网 宿松网|宿松在线|宿松门户|安徽宿松(直管县)|宿松新闻综合网站|宿松官方新闻发布 | 低粘度纤维素|混凝土灌浆料|有机硅憎水粉|聚羧酸减水剂-南京斯泰宝 | 便携式谷丙转氨酶检测仪|华图生物科技百科 | 百度爱采购运营研究社社群-店铺托管-爱采购代运营-良言多米网络公司 | 广州办公室设计,办公室装修,写字楼设计,办公室装修公司_德科 | 成都租车_成都租车公司_成都租车网_众行宝 | 车充外壳,车载充电器外壳,车载点烟器外壳,点烟器连接头,旅行充充电器外壳,手机充电器外壳,深圳市华科达塑胶五金有限公司 | 防渗膜厂家|养殖防渗膜|水产养殖防渗膜-泰安佳路通工程材料有限公司 | 耐腐蚀泵,耐腐蚀真空泵,玻璃钢真空泵-淄博华舜耐腐蚀真空泵有限公司 | 阳光模拟试验箱_高低温试验箱_高低温冲击试验箱_快速温变试验箱|东莞市赛思检测设备有限公司 | 安徽千住锡膏_安徽阿尔法锡膏锡条_安徽唯特偶锡膏_卡夫特胶水-芜湖荣亮电子科技有限公司 | 生物风-销售载体,基因,质粒,ATCC细胞,ATCC菌株等,欢迎购买-百风生物 | 餐饮小吃技术培训-火锅串串香培训「何小胖培训」_成都点石成金[官网] | 网站建设,北京网站建设,北京网站建设公司,网站系统开发,北京网站制作公司,响应式网站,做网站公司,海淀做网站,朝阳做网站,昌平做网站,建站公司 | Trimos测长机_测高仪_TESA_mahr,WYLER水平仪,PWB对刀仪-德瑞华测量技术(苏州)有限公司 | 螺杆式冷水机-低温冷水机厂家-冷冻机-风冷式-水冷式冷水机-上海祝松机械有限公司 | 铝合金线槽_铝型材加工_空调挡水板厂家-江阴炜福金属制品有限公司 |