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

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

Java多線程通信:交替打印ABAB實例

瀏覽:3日期:2022-08-26 09:01:43

使用wait()和notify()實現Java多線程通信:兩個線程交替打印A和B,如ABABAB

public class Test { public static void main(String[] args) { final PrintAB print = new PrintAB(); new Thread(new Runnable() { public void run(){for(int i=0;i<5;i++) { print.printA(); } } }).start(); new Thread(new Runnable() { public void run() {for(int i=0;i<5;i++) { print.printB(); } } }).start(); } } class PrintAB{ private boolean flag = true; public synchronized void printA () { while(!flag) {try { this.wait();} catch (InterruptedException e) { e.printStackTrace(); } }System.out.print('A'); flag = false; this.notify(); } public synchronized void printB () { while(flag) {try { this.wait();} catch (InterruptedException e) { e.printStackTrace();} } System.out.print('B'); flag = true; this.notify(); } }

補充知識:Java多個線程順序打印數字

要求

啟動N個線程, 這N個線程要不間斷按順序打印數字1-N. 將問題簡化為3個線程無限循環打印1到3

方法一: 使用synchronized

三個線程無序競爭同步鎖, 如果遇上的是自己的數字, 就打印. 這種方式會浪費大量的循環

public class TestSequential1 { private volatile int pos = 1; private volatile int count = 0; public void one(int i) { synchronized (this) { if (pos == i) {System.out.println('T-' + i + ' ' + count);pos = i % 3 + 1;count = 0; } else {count++; } } } public static void main(String[] args) { TestSequential1 demo = new TestSequential1(); for (int i = 1; i <=3; i++) { int j = i; new Thread(()->{while(true) { demo.one(j);} }).start(); } }}

輸出

T-1 0T-2 5793T-3 5285T-1 2616T-2 33T-3 28T-1 22T-2 44T-3 6T-1 881T-2 118358T-3 247380T-1 30803T-2 29627T-3 52044...

方法二: 使用synchronized配合wait()和notifyAll()

競爭同步鎖時使用wait()和notifyAll(), 可以避免浪費循環

public class TestSequential4 { private volatile int pos = 1; private volatile int count = 0; private final Object obj = new Object(); public void one(int i) { System.out.println(i + ' try'); synchronized (obj) { System.out.println(i + ' in'); try {while (pos != i) { count++; System.out.println(i + ' wait'); obj.wait();}System.out.println('T-' + i + ' ' + count);pos = i % 3 + 1;count = 0;obj.notifyAll(); } catch (InterruptedException e) {e.printStackTrace(); } } } public static void main(String[] args) { TestSequential4 demo = new TestSequential4(); for (int i = 3; i >=1; i--) { int j = i; new Thread(()->{while(true) { demo.one(j);} }).start(); } }}

輸出

3 try3 in3 wait2 try2 in2 wait1 try1 inT-1 21 try1 in1 waitT-2 12 try2 in2 waitT-3 13 try3 in3 wait2 waitT-1 21 try1 in1 waitT-2 12 try2 in2 waitT-3 13 try3 in3 wait2 waitT-1 21 try1 in1 waitT-2 12 try2 in2 waitT-3 13 try3 in3 wait2 waitT-1 21 try1 in1 waitT-2 12 try2 in2 waitT-3 13 try3 in3 wait2 waitT-1 21 try1 in1 waitT-2 12 try2 in2 waitT-3 13 try3 in3 wait2 waitT-1 21 try1 in1 waitT-2 12 try2 in2 waitT-3 13 try3 in3 wait2 waitT-1 21 try1 in1 waitT-2 12 try2 in2 waitT-3 13 try3 in3 wait2 waitT-1 21 try1 in1 waitT-2 12 try2 in2 waitT-3 13 try3 in3 wait2 waitT-1 21 try1 in1 waitT-2 12 try2 in2 waitT-3 13 try3 in3 wait2 waitT-1 2...

方法三: 使用可重入鎖

用Lock做, 非公平鎖, 三個線程競爭, 如果遇上的是自己的數字, 就打印. 這種方式也會浪費大量的循環

public class TestSequential2 { private final Lock lock = new ReentrantLock(); private volatile int pos = 1; private volatile int count = 0; public void one(int i) { lock.lock(); if (pos == i) { System.out.println('T-' + i + ' ' + count); pos = i % 3 + 1; count = 0; } else { count++; } lock.unlock(); } public static void main(String[] args) { TestSequential2 demo = new TestSequential2(); for (int i = 1; i <=3; i++) { int j = i; new Thread(()->{while(true) { demo.one(j);} }).start(); } }}

輸出

T-1 0T-2 0T-3 323T-1 54T-2 68964T-3 97642T-1 6504T-2 100603T-3 6989T-1 1313T-2 0T-3 183741T-1 233T-2 5081T-3 164367..

方法四: 使用可重入鎖, 啟用公平鎖

和3一樣, 但是使用公平鎖, 這種情況下基本上可以做到順序執行, 偶爾會產生多一次循環

private final Lock lock = new ReentrantLock(true);

輸出

T-1 0T-2 0T-3 0T-1 0T-2 0T-3 0T-1 0T-2 0T-3 0T-1 0T-2 0T-3 1T-1 1T-2 1T-3 1...

方法五: 使用Condition

每個線程如果看到不是自己的計數, 就await(), 如果是自己的計數, 就完成打印動作, 再signalAll()所有其他線程去繼續運行, 自己在下一個循環后, 即使又繼續執行, 也會因為計數已經變了而await.

如果ReentrantLock構造參數使用true, 可以基本消除 ~await 這一步的輸出.

public class ReentrantLockCondition2 { private static Lock lock = new ReentrantLock(); private static Condition condition = lock.newCondition(); private volatile int state = 1; private void handle(int state) { lock.lock(); try { while(true) {while(this.state != state) { System.out.println(state + ' ~await'); condition.await();}System.out.println(state);this.state = state % 3 + 1;condition.signalAll();System.out.println(state + ' await');condition.await(); } } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } public static void main(String[] args) { ReentrantLockCondition2 rlc = new ReentrantLockCondition2(); new Thread(()->rlc.handle(1)).start(); new Thread(()->rlc.handle(2)).start(); new Thread(()->rlc.handle(3)).start(); }}

方法六: 使用多個Condition

給每個線程不同的condition. 這個和4的區別是, 可以用condition.signal()精確地通知對應的線程繼續執行(在對應的condition上await的線程, 可能是多個). 這種情況下是可以多個線程都不unlock鎖的情況下進行協作的. 注意下面的while(true)循環是在lock.lock()方法內部的.

public class ReentrantLockCondition { private static Lock lock = new ReentrantLock(); private static Condition[] conditions = {lock.newCondition(), lock.newCondition(), lock.newCondition()}; private volatile int state = 1; private void handle(int state) { lock.lock(); try { while(true) {while(this.state != state) { conditions[state - 1].await();}System.out.println(state);this.state = state % 3 + 1;conditions[this.state - 1].signal();conditions[state - 1].await(); } } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } public static void main(String[] args) { ReentrantLockCondition rlc = new ReentrantLockCondition(); new Thread(()->rlc.handle(1)).start(); new Thread(()->rlc.handle(2)).start(); new Thread(()->rlc.handle(3)).start(); }}

以上這篇Java多線程通信:交替打印ABAB實例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
主站蜘蛛池模板: 球磨机 选矿球磨机 棒磨机 浮选机 分级机 选矿设备厂家 | 继电器模组-IO端子台-plc连接线-省配线模组厂家-世麦德 | elisa试剂盒价格-酶联免疫试剂盒-猪elisa试剂盒-上海恒远生物科技有限公司 | 搪瓷反应釜厂家,淄博搪瓷反应釜-淄博卓耀| 不锈钢水箱生产厂家_消防水箱生产厂家-河南联固供水设备有限公司 | 板框压滤机-隔膜压滤机配件生产厂家-陕西华星佳洋装备制造有限公司 | 理化生实验室设备,吊装实验室设备,顶装实验室设备,实验室成套设备厂家,校园功能室设备,智慧书法教室方案 - 东莞市惠森教学设备有限公司 | HEYL硬度计量泵-荧光法在线溶解氧仪-净时测控技术(上海)有限公司 | 广东成考网-广东成人高考网 | 安徽合肥格力空调专卖店_格力中央空调_格力空调总经销公司代理-皖格制冷设备 | 东莞ERP软件_广州云ERP_中山ERP_台湾工厂erp系统-广东顺景软件科技有限公司 | 一级建造师培训_一建培训机构_中建云筑建造师培训网校 | 济南侦探调查-济南调查取证-山东私家侦探-山东白豹调查咨询公司 密集架|电动密集架|移动密集架|黑龙江档案密集架-大量现货厂家销售 | 优秀的临床医学知识库,临床知识库,医疗知识库,满足电子病历四级要求,免费试用 | 无线遥控更衣吊篮_IC卡更衣吊篮_电动更衣吊篮配件_煤矿更衣吊篮-力得电子 | 杭州中央空调维修_冷却塔/新风机柜/热水器/锅炉除垢清洗_除垢剂_风机盘管_冷凝器清洗-杭州亿诺能源有限公司 | 海外仓系统|国际货代系统|退货换标系统|WMS仓储系统|海豚云 | 光照全温振荡器(智能型)-恒隆仪器| 杭州公司变更法人-代理记账收费价格-公司注销代办_杭州福道财务管理咨询有限公司 | LED投光灯-工矿灯-led路灯头-工业灯具 - 山东普瑞斯照明科技有限公司 | Magnescale探规,Magnescale磁栅尺,Magnescale传感器,Magnescale测厚仪,Mitutoyo光栅尺,笔式位移传感器-苏州连达精密量仪有限公司 | 南京展台搭建-南京展会设计-南京展览设计公司-南京展厅展示设计-南京汇雅展览工程有限公司 | 高空重型升降平台_高空液压举升平台_高空作业平台_移动式升降机-河南华鹰机械设备有限公司 | 台湾HIWIN上银直线模组|导轨滑块|TBI滚珠丝杆丝杠-深圳汉工 | 百方网-百方电气网,电工电气行业专业的B2B电子商务平台 | 煤矿人员精确定位系统_矿用无线通信系统_煤矿广播系统 | 欧洲MV日韩MV国产_人妻无码一区二区三区免费_少妇被 到高潮喷出白浆av_精品少妇自慰到喷水AV网站 | 手术室净化厂家_成都实验室装修公司_无尘车间施工单位_洁净室工程建设团队-四川华锐16年行业经验 | 氟塑料磁力泵-不锈钢离心泵-耐腐蚀化工泵厂家「皖金泵阀」 | 派财经_聚焦数字经济内容服务平台 | 大数据营销公司_舆情监测软件_上海SEO公司-文军营销官网 | 北钻固控设备|石油钻采设备-石油固控设备厂家 | BAUER减速机|ROSSI-MERSEN熔断器-APTECH调压阀-上海爱泽工业设备有限公司 | 广州冷却塔维修厂家_冷却塔修理_凉水塔风机电机填料抢修-广东康明节能空调有限公司 | 袋式过滤器,自清洗过滤器,保安过滤器,篮式过滤器,气体过滤器,全自动过滤器,反冲洗过滤器,管道过滤器,无锡驰业环保科技有限公司 | 媒介云-全网整合营销_成都新闻媒体发稿_软文发布平台 | 气动|电动调节阀|球阀|蝶阀-自力式调节阀-上海渠工阀门管道工程有限公司 | 智能家居全屋智能系统多少钱一套-小米全套价格、装修方案 | 对夹式止回阀_对夹式蝶形止回阀_对夹式软密封止回阀_超薄型止回阀_不锈钢底阀-温州上炬阀门科技有限公司 | 安徽免检低氮锅炉_合肥燃油锅炉_安徽蒸汽发生器_合肥燃气锅炉-合肥扬诺锅炉有限公司 | 锂辉石检测仪器,水泥成分快速分析仪-湘潭宇科分析仪器有限公司 |