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

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

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

瀏覽:34日期: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
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩精品午夜视频| 麻豆视频在线观看免费网站黄| 日本精品另类| 少妇精品久久久| 蜜臀国产一区二区三区在线播放| 91精品综合| 激情婷婷久久| 99久精品视频在线观看视频| 视频小说一区二区| 国产探花一区在线观看| 国产一区二区三区不卡视频网站 | 首页亚洲欧美制服丝腿| 免播放器亚洲| 欧美在线观看天堂一区二区三区| 日韩精品免费一区二区夜夜嗨 | 亚洲伊人av| 黄色亚洲大片免费在线观看| 亚洲二区精品| 亚洲精品美女91| 麻豆视频观看网址久久| 日韩av免费| 日韩精品中文字幕吗一区二区| 欧美日韩在线精品一区二区三区激情综合| 国产日韩亚洲欧美精品| 国产精品99视频| 国产免费成人| 91欧美极品| 蜜桃视频在线网站| 欧美日韩伊人| 亚洲天堂久久| 国产精品麻豆成人av电影艾秋| 国产 日韩 欧美一区| 亚洲精品无播放器在线播放| 国产一区丝袜| 日韩视频一二区| 欧美一区三区| 国产精品麻豆成人av电影艾秋| 亚洲黑丝一区二区| 精品国产免费人成网站| 蜜桃av一区二区| 久久精品亚洲人成影院| 日韩国产在线不卡视频| 视频一区中文| 麻豆精品视频在线观看| 蜜臀久久久久久久| 国产真实久久| 精品视频网站| 日韩高清二区| 综合激情网站| 欧美在线亚洲| 日韩中文在线电影| 日韩一区三区| 91看片一区| 欧美精品高清| 欧美激情另类| 黄色网一区二区| 国产精品白丝av嫩草影院| 日韩影院在线观看| 99在线精品免费视频九九视 | 蜜桃一区二区三区在线| 99综合视频| 日韩在线网址| 国产探花在线精品一区二区| 91麻豆精品激情在线观看最新| 亚洲精品无吗| 日本不卡在线视频| 欧美一级一区| 精品亚洲a∨| 国语精品一区| 国内在线观看一区二区三区| 美女视频一区在线观看| 久久精品九色| 精品成人免费一区二区在线播放| 日韩欧美精品一区| 亚洲深爱激情| 欧美日韩一区二区三区四区在线观看| 欧美日韩99| 日本在线精品| 亚洲视频二区| 久久99久久人婷婷精品综合| 精品国产免费人成网站| 99热精品在线| 国产精品**亚洲精品| 日韩av自拍| 日韩精品一区二区三区免费观影 | 一区二区三区四区日本视频| 另类中文字幕国产精品| 国产韩日影视精品| 四虎在线精品| 成人精品中文字幕| 人人精品人人爱| 91亚洲一区| 日韩成人午夜精品| 国产黄大片在线观看| 丝袜诱惑制服诱惑色一区在线观看 | 日韩成人精品一区二区三区| 久久久久久婷| 日产欧产美韩系列久久99| 成人在线免费观看网站| 亚洲免费黄色| 999久久久国产精品| 国产精品99久久免费| 亚洲天堂日韩在线| 成人日韩在线观看| 欧美精品97| 日韩精品91亚洲二区在线观看| 视频福利一区| 国产精品久久久久久久久久妞妞| 欧美成人a交片免费看| 日韩欧美中文字幕一区二区三区| 久久男人天堂| 国产精品www.| 亚洲资源网站| 亚洲网站视频| 欧美男人天堂| 国产欧美日韩一级| 亚洲一二av| 国产精品外国| 噜噜噜躁狠狠躁狠狠精品视频| 99精品综合| 99精品美女| 欧美日韩国产在线观看网站 | 欧美日韩亚洲在线观看| 国产精品久久久久久久久久齐齐 | 日韩视频一区| 狠狠色综合网| 亚洲综合精品| 欧美精品一区二区三区精品| 蜜桃av在线播放| 欧美在线观看视频一区| 久久精品青草| 黑丝一区二区| 日韩高清在线不卡| 日韩不卡一二三区| 91综合久久爱com| 鲁大师精品99久久久| 精品视频99| 麻豆精品蜜桃| 麻豆9191精品国产| 日本亚洲不卡| 里番精品3d一二三区| 成人美女视频| 亚洲电影在线| 久久亚洲欧美| 日本aⅴ精品一区二区三区 | 亚洲精品欧洲| 久久影院午夜精品| 国产日韩综合| 国产乱人伦精品一区| 成人福利av| 一区二区日韩免费看| 国产毛片久久久| 99久久激情| 国产精品一区二区精品视频观看| 国产成人精品亚洲线观看| 精品一区在线| 日本a口亚洲| 久久美女性网| 91成人在线精品视频| 88xx成人免费观看视频库| 亚洲自啪免费| 国产一区二区精品久| 在线一区视频| 国产一区二区亚洲| 亚洲三区欧美一区国产二区| 国内精品美女在线观看| 天堂av在线一区| 999国产精品永久免费视频app| 青青青国产精品| 五月精品视频| 国产伦久视频在线观看| 香蕉精品999视频一区二区| 国产欧美三级| 亚洲精选久久| 99在线|亚洲一区二区| 国产精品99久久精品| 日本99精品| 亚洲我射av| 丝袜美腿一区二区三区| 国产成人精品一区二区免费看京| 91成人小视频| 日韩久久一区| 日韩一二三区在线观看| 激情综合亚洲| 久久一区二区中文字幕| 日产精品一区二区| 日韩av中文字幕一区| 欧美午夜不卡| 蜜桃成人av| 91九色精品| 亚洲激情欧美| 国产亚洲精品久久久久婷婷瑜伽| 亚洲第一区色| 国产一区导航| 亚洲男人在线| 日韩超碰人人爽人人做人人添| 日本亚洲视频| 69堂精品视频在线播放| 日韩激情网站| 国产免费av国片精品草莓男男|