亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

Java編程中實現Condition控制線程通信

2024-07-13 10:14:07
字體:
來源:轉載
供稿:網友

java中控制線程通信的方法

1.傳統的方式:利用synchronized關鍵字來保證同步,結合wait(),notify(),notifyAll()控制線程通信。不靈活。

2.利用Condition控制線程通信,靈活。

3.利用管道pipe進行線程通信,不推薦

4.利用BlockingQueue控制線程通信

本文就講解利用Condition控制線程通信,非常靈活的方式。

Condition類是用來保持Lock對象的協調調用。

Condition介紹

使用Condition可以讓那些已經得到lock對象卻無法繼續執行的線程釋放lock對象,Condition對象也可以喚醒處于等待的線程。

Condition 將 Object 監視器方法(wait、notify 和 notifyAll)分解成截然不同的對象,以便通過將這些對象與任意 Lock 實現組合使用,為每個對象提供多個等待 set(wait-set)。其中,Lock 替代了 synchronized 方法和語句的使用,Condition 替代了 Object 監視器方法的使用。

Condition 實例實質上被綁定到一個鎖上。要為特定 Lock 實例獲得 Condition 實例,使用其 newCondition() 方法。

Condition類提供了如下三個方法:

await():造成當前線程在接到信號或被中斷之前一直處于等待狀態。 該方法流程:

1.新建Condition Node包裝線程,加入Condition隊列。

2.釋放當前線程占有的鎖

3.阻塞當前線程

signal():喚醒當前lock對象的一個等待線程。signal方法只是將Node(await方法封裝的)修改了狀態,并沒有喚醒線程。要將修改狀態后的Node喚醒,一種是再次調用await(),一種是調用unlock()。//這局句很重要,不明白的可以看我下一篇博客。

signalAll():喚醒當前lock對象的所有等待線程。只有當前線程放棄對lock的鎖定,被喚醒的線程才可以執行。

代碼實例:

代碼邏輯:Account類實現同步的取錢(draw)、存錢(deposit)操作;DrawThread循環取錢的線程、DepositThread循環存錢的線程。

Account:

package condition;import java.util.concurrent.locks.*;/** *存錢、取錢 */public class Account{ //顯示定義Lock對象 private final Lock lock = new ReentrantLock();//可重入鎖 //獲得指定Lock對象對應的條件變量 private final Condition cond = lock.newCondition(); //獲得condition實例 private String accountNo; private double balance; //標識賬戶中是否已經存款的旗標 private boolean flag = false; public Account(){} public Account(String accountNo , double balance) {  this.accountNo = accountNo;  this.balance = balance; } public void setAccountNo(String accountNo) {  this.accountNo = accountNo; } public String getAccountNo() {   return this.accountNo; } public double getBalance() {   return this.balance; } /**  *取款  * @param drawAmount  */ public void draw(double drawAmount) {  //加鎖  lock.lock();  System.out.println(Thread.currentThread().getName() +"進入封鎖區。。。。。。。。");  try  {   //如果賬戶中還沒有存入存款,該線程等待   if (!flag)   {    cond.await();   }   else   {    //執行取錢操作    System.out.println(Thread.currentThread().getName() +     " 取錢:" + drawAmount);    balance -= drawAmount;    System.out.println("賬戶余額為:" + balance);    //將標識是否成功存入存款的旗標設為false    flag = false;    //喚醒該Lock對象對應的其他線程    cond.signalAll();   }  }  catch (InterruptedException ex)  {   ex.printStackTrace();  }  //使用finally塊來確保釋放鎖  finally  {   lock.unlock();   System.out.println("釋放了");  } } /**  * 存款  * @param depositAmount  */ public void deposit(double depositAmount) {  lock.lock();  System.out.println(Thread.currentThread().getName() +"進入封鎖區。。。。。。。。");  try  {   //如果賬戶中已經存入了存款,該線程等待   if(flag)   {    System.out.println(Thread.currentThread().getName() +"等待。。。。。。");    cond.await();    }   else   {    //執行存款操作    System.out.println(Thread.currentThread().getName() +     " 存款:" + depositAmount);    balance += depositAmount;    System.out.println("賬戶余額為:" + balance);    //將標識是否成功存入存款的旗標設為true    flag = true;    //喚醒該Lock對象對應的其他線程    cond.signalAll();   }  }  catch (InterruptedException ex)  {   ex.printStackTrace();  }  //使用finally塊來確保釋放鎖  finally  {   lock.unlock();   System.out.println(Thread.currentThread().getName() +"釋放鎖。。。。");  } } public int hashCode() {  return accountNo.hashCode(); } public boolean equals(Object obj) {  if (obj != null && obj.getClass() == Account.class)  {   Account target = (Account)obj;   return target.getAccountNo().equals(accountNo);  }  return false; }}

DrawThread:

package condition;/** *取錢 */public class DrawThread extends Thread{ //模擬用戶賬戶 private Account account; //當前取錢線程所希望取的錢數 private double drawAmount; public DrawThread(String name , Account account ,  double drawAmount) {  super(name);  this.account = account;  this.drawAmount = drawAmount; } //當多條線程修改同一個共享數據時,將涉及到數據安全問題。 public void run() {  for (int i = 0 ; i < 6 ; i++ )  {   account.draw(drawAmount);  } }}

DepositThread:

package condition;/** *存錢 */public class DepositThread extends Thread{ //模擬用戶賬戶 private Account account; //當前取錢線程所希望取的錢數 private double depositAmount; public DepositThread(String name , Account account ,  double depositAmount) {  super(name);  this.account = account;  this.depositAmount = depositAmount; } //當多條線程修改同一個共享數據時,將涉及到數據安全問題。 public void run() {  for (int i = 0 ; i < 2 ; i++ )  {   account.deposit(depositAmount);   System.out.println(Thread.currentThread().getName()+" 存錢結束!");  }   }}

TestDraw:

package condition;public class TestDraw{ public static void main(String[] args) {  //創建一個賬戶  Account acct = new Account("1234567" , 0);  new DrawThread("取錢者" , acct , 800).start();  new DepositThread("存錢者甲" , acct , 800).start();  new DepositThread("存錢者乙" , acct , 800).start();  new DepositThread("存錢者丙" , acct , 800).start(); }}

運行結果:

取錢者進入封鎖區。。。。。。。。
存錢者甲進入封鎖區。。。。。。。。
存錢者甲 存款:800.0
賬戶余額為:800.0
存錢者甲釋放鎖。。。。
存錢者丙進入封鎖區。。。。。。。。
存錢者甲 存錢結束!
存錢者丙等待。。。。。。
存錢者乙進入封鎖區。。。。。。。。
存錢者乙等待。。。。。。
釋放了
存錢者甲進入封鎖區。。。。。。。。
存錢者甲等待。。。。。。
取錢者進入封鎖區。。。。。。。。
取錢者 取錢:800.0
賬戶余額為:0.0
釋放了
取錢者進入封鎖區。。。。。。。。

這里結果只粘貼了一部分。。。。聰明的你會發現這個程序最后阻塞啦,注意是阻塞不是死鎖!阻塞的原因是:三個存錢的線程都運行結束了,但是取錢的線程還沒有,所以阻塞啦。

總結

以上就是本文關于Java編程中實現Condition控制線程通信的全部內容,希望對大家有所幫助。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美国产亚洲视频| 欧美劲爆第一页| www.国产一区| 久久久久久亚洲精品中文字幕| 成人中文字幕在线观看| 欧美激情影音先锋| 亚洲男人天堂2023| 亚洲精品美女网站| 日韩在线一区二区三区免费视频| 精品成人国产在线观看男人呻吟| 日韩高清有码在线| 萌白酱国产一区二区| 国产成人精品日本亚洲专区61| 亚洲人成电影网站色xx| 日韩av在线免播放器| 久久人91精品久久久久久不卡| 综合激情国产一区| 国产精品大片wwwwww| 久久亚洲综合国产精品99麻豆精品福利| 色先锋资源久久综合5566| 国产精品白丝jk喷水视频一区| 中文字幕日韩欧美精品在线观看| 欧美日韩在线视频观看| 亚洲国产小视频在线观看| 日韩av在线资源| 国产在线视频91| 91色琪琪电影亚洲精品久久| 亚洲国产另类 国产精品国产免费| 亚洲xxxx在线| 日韩国产一区三区| 精品色蜜蜜精品视频在线观看| 国产剧情日韩欧美| 欧美激情网站在线观看| 日韩电影网在线| 国内精品一区二区三区四区| 国产网站欧美日韩免费精品在线观看| 91久久夜色精品国产网站| 中文字幕免费精品一区| 久久99久久99精品免观看粉嫩| 亚洲成人网久久久| 国产精品成人av性教育| 色哟哟网站入口亚洲精品| 国产一区二区三区在线播放免费观看| 日韩中文字幕精品视频| 日韩国产高清污视频在线观看| 日韩成人av在线| 成人精品福利视频| 国产视频自拍一区| 欧美性做爰毛片| 95av在线视频| 午夜精品久久久久久99热软件| 97久久精品在线| 日韩在线激情视频| 最新国产精品亚洲| 成人午夜小视频| 高清一区二区三区四区五区| 91久久久久久久久久久久久| 国产精品美女www| 日本高清久久天堂| 伊人av综合网| 国产精品免费久久久| 久久久久中文字幕| 亚洲一级一级97网| 精品久久香蕉国产线看观看亚洲| 成人羞羞国产免费| 国产精品丝袜视频| 亚洲影影院av| 国产精品白嫩美女在线观看| 91av视频在线观看| 国产精品91久久久久久| 在线成人激情视频| 国产精品99蜜臀久久不卡二区| 日韩欧亚中文在线| 欧美精品福利视频| 成人午夜激情免费视频| 亚洲人成电影网站色…| 国产99在线|中文| 97超级碰碰碰久久久| 国产盗摄xxxx视频xxx69| 日韩欧美第一页| 国产精品偷伦视频免费观看国产| 亚洲一区二区三区sesese| 不卡av电影在线观看| 亚洲国产女人aaa毛片在线| 欧美理论电影在线播放| 成人激情视频网| 96国产粉嫩美女| 日本乱人伦a精品| 国产欧美久久久久久| 日韩一区视频在线| 亚洲在线免费视频| 欧美极品少妇xxxxⅹ免费视频| 国产成人精品视频在线| 国产亚洲美女精品久久久| 精品久久久一区| 亚洲天堂第一页| 黄色精品在线看| 欧美大片第1页| 日韩亚洲欧美成人| 国产免费亚洲高清| 免费99精品国产自在在线| 不用播放器成人网| 日韩在线视频播放| 日本高清视频一区| 日韩欧美有码在线| 欧美激情精品久久久久久| 欧美精品一区二区三区国产精品| 国内精品视频久久| 国产婷婷成人久久av免费高清| 欧美性色视频在线| 久久久免费高清电视剧观看| 欧美日韩在线影院| 亚洲精品久久久久中文字幕二区| 97人人模人人爽人人喊中文字| 日韩福利在线播放| 欧美性videos高清精品| 精品国产视频在线| 国产精品日韩专区| 91po在线观看91精品国产性色| 亚洲第一网站免费视频| 亚洲精品电影在线观看| 国产精品9999| 久热精品视频在线免费观看| 色综合影院在线| 欧美性高潮床叫视频| 久久成人一区二区| 在线国产精品播放| 欧美日韩亚洲精品一区二区三区| 日韩av大片在线| 51久久精品夜色国产麻豆| 亚洲精品影视在线观看| 国产亚洲精品久久久| 免费91麻豆精品国产自产在线观看| 亚洲精品福利资源站| 久久人人爽人人爽人人片av高清| 欧美激情久久久久久| 亚洲欧洲视频在线| 久久国产天堂福利天堂| zzjj国产精品一区二区| 日韩精品中文字幕久久臀| 青青草国产精品一区二区| 操日韩av在线电影| 日韩高清电影免费观看完整| 97香蕉久久夜色精品国产| 亚洲色图第三页| 日本道色综合久久影院| 欧美成人一二三| 国产精品网址在线| 精品国内亚洲在观看18黄| 欧美激情一区二区三区成人| 97久久精品人搡人人玩| 欧美日本在线视频中文字字幕| 性视频1819p久久| 国产精品高精视频免费| 欧美特级www| 欧美激情一级欧美精品| 中文字幕在线精品| 久久久久久亚洲精品不卡| 国产成人综合精品| 欧美极品少妇与黑人| 麻豆精品精华液| 欧美视频在线观看免费网址| 亚洲精品av在线播放| 亚洲精品二三区|