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

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

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

瀏覽:31日期: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久久,三上悠亚国产精品一区二区三区
日韩高清在线观看一区二区| 99热精品在线| 日韩欧美在线精品| 久久不射中文字幕| 日精品一区二区三区| 四虎在线精品| 亚洲美女久久| 青草久久视频| 国产精品99久久免费观看| 老司机精品视频在线播放| 国产成人久久精品麻豆二区| av资源亚洲| 欧美美女一区| 蜜臀久久99精品久久久久久9| 亚洲日本欧美| 日韩制服丝袜av| 亚洲精品在线a| 国产私拍福利精品视频二区| 欧美黑人巨大videos精品| 久久99国产精品视频| 国产一区国产二区国产三区| 午夜av不卡| 性欧美69xoxoxoxo| 蜜桃一区二区三区在线| 日本不卡高清| 激情中国色综合| 不卡中文字幕| 日韩在线一二三区| 国产精品草草| 97精品97| 不卡一区综合视频| 伊人久久一区| 久久久久观看| 福利精品在线| 久久国产日本精品| 视频一区欧美精品| 国产精品主播在线观看| 亚洲不卡系列| 亚洲三级av| 91综合视频| 美女尤物久久精品| 国产精品伦一区二区| 久久高清免费| 日韩精品a在线观看91| 国产91在线精品| 欧美 日韩 国产精品免费观看| 久久国产精品久久w女人spa| 欧美日韩亚洲一区二区三区在线| 国产不卡一区| 男女激情视频一区| 免费日韩成人| 精品一区欧美| 国产麻豆一区二区三区精品视频| 日韩免费小视频| 日韩国产在线一| 日韩精品一区二区三区免费观影 | 91精品视频一区二区| av中文字幕在线观看第一页| 亚洲一区二区日韩| 久久久久久一区二区| 西西人体一区二区| 久久久国产精品网站| 国产亚洲福利| 精品久久久亚洲| 深夜日韩欧美| 久久高清免费| 免费在线观看一区| 亚洲欧美不卡| 中文字幕在线看片| 91福利精品在线观看| 亚洲精品2区| 麻豆视频一区二区| 婷婷亚洲成人| 久久在线电影| 毛片不卡一区二区| 视频一区二区三区入口| 成人午夜网址| 日韩av不卡在线观看| 欧美日韩国产综合网| 精品国产欧美日韩| 色狠狠一区二区三区| 久久精品一区二区不卡| 国产福利资源一区| 免费在线观看成人| 久久精品主播| 国产精品精品国产一区二区| 日韩精品国产精品| 西西人体一区二区| 99久久亚洲精品| 精品国产黄a∨片高清在线| 婷婷精品久久久久久久久久不卡| 激情欧美一区二区三区| 精品国产乱码久久久久久1区2匹| 日韩一区免费| 午夜在线一区二区| 国产伊人精品| 蜜臀久久精品| 国产成人a视频高清在线观看| 欧美影院精品| 爽爽淫人综合网网站| 久久精品播放| 婷婷综合六月| 91一区二区三区四区| 麻豆精品在线视频| 日本精品国产| 亚洲影院天堂中文av色| 一区在线观看| 久久中文字幕av| 成人精品亚洲| 成人影视亚洲图片在线| 美女视频黄久久| 国产日韩欧美在线播放不卡| 日本国产欧美| 日本欧美韩国一区三区| 日韩精品视频在线看| 午夜亚洲福利| 欧美一区不卡| 国产精品一区二区精品视频观看| 日韩区一区二| 丝袜美腿一区二区三区| 国产精品女主播一区二区三区| 国产在线欧美| 国产亚洲网站| 久久亚洲风情| 亚洲日产国产精品| 日韩av三区| 国产精品成人**免费视频 | 久久精品欧洲| 精品视频网站| 日韩大片在线播放| 欧美片第1页| 久久久久中文| 日韩精品免费一区二区在线观看| 久久九九精品| 一区二区自拍| 综合色就爱涩涩涩综合婷婷| 日本亚州欧洲精品不卡| 日本国产一区| 久久久91麻豆精品国产一区| 国产一区二区三区久久| 天堂中文av在线资源库| 亚洲一级二级| 日韩影院免费视频| 久久精品凹凸全集| 久久尤物视频| 久久激情婷婷| 日韩亚洲精品在线| 美女国产一区| 国产亚洲精品美女久久久久久久久久| 国产美女撒尿一区二区| 国产成人精品亚洲线观看 | 天堂久久一区| 麻豆精品新av中文字幕| 日韩在线观看| 国产农村妇女精品一二区 | 天堂精品久久久久| 欧美精品二区| 91精品在线观看国产| 一级欧洲+日本+国产| 亚洲精品女人| 精品国产日韩欧美精品国产欧美日韩一区二区三区 | 欧美成人a交片免费看| 亚洲精品2区| 国产日本亚洲| 色婷婷久久久| 亚洲乱码视频| 国内精品亚洲| 蜜桃成人av| 日韩在线网址| 麻豆网站免费在线观看| 丝袜美腿一区二区三区| 国产日韩免费| 成人久久一区| 日韩一区网站| аⅴ资源天堂资源库在线| 国产一区二区精品| 国产精品美女午夜爽爽| 久久久9色精品国产一区二区三区| 亚洲一区黄色| 精品一区二区三区四区五区| 欧美69视频| 国产午夜久久av| 91看片一区| 日韩动漫一区| 亚洲人成在线网站| 亚洲精品三级| 国产不卡人人| 日本va欧美va瓶| 中文字幕系列一区| 欧美一级网站| 久久精品官网| 国产乱码精品一区二区三区亚洲人 | 国产亚洲欧美日韩在线观看一区二区| 国产精品成久久久久| 免费观看久久久4p| 国产粉嫩在线观看| 色综合视频一区二区三区日韩| 波多野结衣久久精品| 日韩一区二区三区在线看| 中文字幕人成乱码在线观看 |