欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

Java怎么使用Condition控制線程通信-創(chuàng)新互聯(lián)

這篇文章給大家分享的是有關Java怎么使用Condition控制線程通信的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

創(chuàng)新互聯(lián)建站是專業(yè)的永清網(wǎng)站建設公司,永清接單;提供網(wǎng)站建設、成都網(wǎng)站設計,網(wǎng)頁設計,網(wǎng)站設計,建網(wǎng)站,PHP網(wǎng)站建設等專業(yè)做網(wǎng)站服務;采用PHP框架,可快速的進行永清網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!

具體如下:

一 點睛

當使用Lock對象來保證同步時,Java提供了一個Condition類來保持協(xié)調,使用Condition可以讓那些已經(jīng)得到Lock對象、卻無法繼續(xù)執(zhí)行的線程釋放Lock對象,Condtion對象也可以喚醒其他處于等待的線程。

Condition 將同步監(jiān)視鎖方法(wait、notify 和 notifyAll)分解成截然不同的對象,以便通過將這些對象與Lock對象組合使用,為每個對象提供多個等待集(wait-set)。在這種情況下,Lock 替代了同步方法或同步代碼塊,Condition替代了同步監(jiān)視鎖的功能。

Condition實例實質上被綁定在一個Lock對象上。要獲得特定Lock實例的Condition實例,調用Lock對象newCondition()方法即可。Condtion類提供了如下三個方法:

await():類似于隱式同步監(jiān)視器上的wait()方法,導致當前線程等待,直到其他線程調用該Condtion的signal ()方法或signalAll ()方法來喚醒該線程。該await方法有更多變體:long awaitNanos(long nanosTimeout)、void awaitUninterruptibly()、awaitUntil(Date deadline)等,可以完成更豐富的等待操作。

signal ():喚醒在此Lock對象上等待的單個線程。如果所有線程都在該Lock對象上等待,則會選擇喚醒其中一個線程。選擇是任意性的。只有當前線程放棄對該Lock對象的鎖定后(使用await()方法),才可以執(zhí)行被喚醒的線程。

signalAll():喚醒在此Lock對象上等待的所有線程。只有當前線程放棄對該該Lock對象的鎖定后,才可以執(zhí)行被喚醒的線程。

二 代碼

1 Account類

public class Account{   // 顯式定義Lock對象   private final Lock lock = new ReentrantLock();   // 獲得指定Lock對象對應的Condition   private final Condition cond = lock.newCondition();   // 封裝賬戶編號、賬戶余額的兩個成員變量   private String accountNo;   private double balance;   // 標識賬戶中是否已有存款的旗標   private boolean flag = false;   public Account(){}   // 構造器   public Account(String accountNo , double balance)   {      this.accountNo = accountNo;      this.balance = balance;   }   // accountNo的setter和getter方法   public void setAccountNo(String accountNo)   {      this.accountNo = accountNo;   }   public String getAccountNo()   {      return this.accountNo;   }   // 因此賬戶余額不允許隨便修改,所以只為balance提供getter方法,   public double getBalance()   {      return this.balance;   }   public void draw(double drawAmount)   {      // 加鎖      lock.lock();      try      {        // 如果flag為假,表明賬戶中還沒有人存錢進去,取錢方法阻塞        if (!flag)        {           cond.await();        }        else        {           // 執(zhí)行取錢           System.out.println(Thread.currentThread().getName()              + " 取錢:" + drawAmount);           balance -= drawAmount;           System.out.println("賬戶余額為:" + balance);           // 將標識賬戶是否已有存款的旗標設為false。           flag = false;           // 喚醒其他線程           cond.signalAll();        }      }      catch (InterruptedException ex)      {        ex.printStackTrace();      }      // 使用finally塊來釋放鎖      finally      {        lock.unlock();      }   }   public void deposit(double depositAmount)   {      lock.lock();      try      {        // 如果flag為真,表明賬戶中已有人存錢進去,則存錢方法阻塞        if (flag)       // ①        {           cond.await();        }        else        {           // 執(zhí)行存款           System.out.println(Thread.currentThread().getName()              + " 存款:" + depositAmount);           balance += depositAmount;           System.out.println("賬戶余額為:" + balance);           // 將表示賬戶是否已有存款的旗標設為true           flag = true;           // 喚醒其他線程           cond.signalAll();        }      }      catch (InterruptedException ex)      {        ex.printStackTrace();      }      // 使用finally塊來釋放鎖      finally      {        lock.unlock();      }   }   // 下面兩個方法根據(jù)accountNo來重寫hashCode()和equals()方法   public int hashCode()   {      return accountNo.hashCode();   }   public boolean equals(Object obj)   {      if(this == obj)        return true;      if (obj !=null        && obj.getClass() == Account.class)      {        Account target = (Account)obj;        return target.getAccountNo().equals(accountNo);      }      return false;   }}

2 DrawThread線程類

public class DrawThread extends Thread{   // 模擬用戶賬戶   private Account account;   // 當前取錢線程所希望取的錢數(shù)   private double drawAmount;   public DrawThread(String name , Account account      , double drawAmount)   {      super(name);      this.account = account;      this.drawAmount = drawAmount;   }   // 重復100次執(zhí)行取錢操作   public void run()   {      for (int i = 0 ; i < 100 ; i++ )      {        account.draw(drawAmount);      }   }}

3 DepositThread線程類

public class DepositThread extends Thread{   // 模擬用戶賬戶   private Account account;   // 當前取錢線程所希望存款的錢數(shù)   private double depositAmount;   public DepositThread(String name , Account account      , double depositAmount)   {      super(name);      this.account = account;      this.depositAmount = depositAmount;   }   // 重復100次執(zhí)行存款操作   public void run()   {      for (int i = 0 ; i < 100 ; i++ )      {        account.deposit(depositAmount);      }   }}

4 測試類

public class DrawTest{   public static void main(String[] args)   {      // 創(chuàng)建一個賬戶      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存款者甲 存款:800.0賬戶余額為:800.0取錢者 取錢:800.0賬戶余額為:0.0存款者丙 存款:800.0賬戶余額為:800.0取錢者 取錢:800.0賬戶余額為:0.0存款者甲 存款:800.0賬戶余額為:800.0取錢者 取錢:800.0賬戶余額為:0.0存款者丙 存款:800.0賬戶余額為:800.0取錢者 取錢:800.0賬戶余額為:0.0存款者甲 存款:800.0賬戶余額為:800.0

感謝各位的閱讀!關于“Java怎么使用Condition控制線程通信”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

文章名稱:Java怎么使用Condition控制線程通信-創(chuàng)新互聯(lián)
文章分享:http://www.aaarwkj.com/article12/ccoegc.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供建站公司、網(wǎng)站建設品牌網(wǎng)站建設、虛擬主機搜索引擎優(yōu)化、定制開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

h5響應式網(wǎng)站建設
精品亚洲美无人区乱码| 日本中文字幕免费专区| 中文字幕在线视频黄字幕| 国产av剧情一区二区| 精品亚洲第一区二区免费在线| 三级黄色片免费久久久| 欧美激情性国产精品潮| 91日韩国产中文字幕| 欧美久久精品在线观看| 日本三本道成人免费毛片| 国产亚洲成人精品久久| 欧美日韩一区二区三区四区在线观看 | 亚洲国产欧美精品综合在线| 日本午夜熟女九色视频| 人妻熟女在线一区二区| 99亚洲综合一区二区三区| 亚洲日本欧美一区二区| 97视频精品全部免费观看| 午夜在线观看视频免费| 91午夜福利视频在线观看| 亚洲欧美不卡一区二区| 免费在线观看av日韩| 蜜臀av一区二区三区人妻| 蜜桃视频中文字幕二区三区 | 中文字幕av久久激情| 日本免费中文字幕在线| 国产成人精品亚洲日本片| 啄木乌欧美一区二区三| 女人裸体网站无遮挡午夜| 国产亚洲欧美日韩中文字幕 | 蜜臀视频网站在线观看| 蜜桃福利视频一区二区| 国产精品果亚洲av无人区一区| 久久免费观看性生活片| 国产亚洲精品第一综合| 密臀av一区二区三区| 中国女人内射91熟女| 亚洲精品福利在线视频| 97日韩在线免费视频网站| 欧美大片高清在线观看| 巴西老熟女大奶子多毛逼|