欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳細(xì)分析java線(xiàn)程wait和notify

 更新時(shí)間:2015年07月29日 10:33:58   作者:ketqi  
本篇文章是對(duì)java多線(xiàn)程wait()和notify()進(jìn)行了詳細(xì)的分析介紹,需要了解的朋友參考下

wait()和notify()是直接隸屬于Object類(lèi),也就是說(shuō),所有對(duì)象都擁有這一對(duì)方法。初看起來(lái)這十分 不可思議,但是實(shí)際上卻是很自然的,因?yàn)檫@一對(duì)方法阻塞時(shí)要釋放占用的鎖,而鎖是任何對(duì)象都具有的,調(diào)用任意對(duì)象的 wait() 方法導(dǎo)致線(xiàn)程阻塞,并且該對(duì)象上的鎖被釋放。而調(diào)用任意對(duì)象的notify()方法則導(dǎo)致因調(diào)用該對(duì)象的wait() 方法而阻塞的線(xiàn)程中隨機(jī)選擇的一個(gè)解除阻塞(但要等到獲得鎖后才真正可執(zhí)行)。

其次,wait()和notify()可在任何位置調(diào)用,但是這一對(duì)方法卻必須在 synchronized 方法或塊中調(diào)用,理由也很簡(jiǎn)單,只有在 synchronized 方法或塊中當(dāng)前線(xiàn)程才占有鎖,才有鎖可以釋放。同樣的道理,調(diào)用這一對(duì)方法的對(duì)象上的鎖必須為當(dāng)前線(xiàn)程所擁有,這樣才有鎖可以 釋放。因此,方法調(diào)用必須放置在這樣的 synchronized 方法或塊中,該方法或塊的加鎖對(duì)象就是調(diào)用這些方法的對(duì)象。若不滿(mǎn)足這一條 件,則程序雖然仍能編譯,但在運(yùn)行時(shí)會(huì)出現(xiàn)IllegalMonitorStateException 異常。

 wait() 和 notify() 方法的上述特性決定了它們經(jīng)常和synchronized 方法或塊一起使用,將它們和操作系統(tǒng)的進(jìn)程間通信機(jī)制作 一個(gè)比較就會(huì)發(fā)現(xiàn)它們的相似性:synchronized方法或塊提供了類(lèi)似于操作系統(tǒng)原語(yǔ)的功能,它們的執(zhí)行不會(huì)受到多線(xiàn)程機(jī)制的干擾,而這一對(duì)方法則 相當(dāng)于 block 和wakeup 原語(yǔ)(這一對(duì)方法均聲明為 synchronized)。它們的結(jié)合使得我們可以實(shí)現(xiàn)操作系統(tǒng)上一系列精妙的進(jìn)程間 通信的算法(如信號(hào)量算法),并用于解決各種復(fù)雜的線(xiàn)程間通信問(wèn)題。
 

關(guān)于 wait() 和 notify() 方法最后再說(shuō)明兩點(diǎn):
    第一:調(diào)用 notify() 方法導(dǎo)致解除阻塞的線(xiàn)程是從因調(diào)用該對(duì)象的 wait() 方法而阻塞的線(xiàn)程中隨機(jī)選取的,我們無(wú)法預(yù)料哪一個(gè)線(xiàn)程將會(huì)被選擇,所以編程時(shí)要特別小心,避免因這種不確定性而產(chǎn)生問(wèn)題。
    第二:除了 notify(),還有一個(gè)方法 notifyAll() 也可起到類(lèi)似作用,唯一的區(qū)別在于,調(diào)用 notifyAll() 方法將把因調(diào) 用該對(duì)象的 wait() 方法而阻塞的所有線(xiàn)程一次性全部解除阻塞。當(dāng)然,只有獲得鎖的那一個(gè)線(xiàn)程才能進(jìn)入可執(zhí)行狀態(tài)。

相關(guān)wait和notify使用demo:

/**
 * <pre>
 * 子線(xiàn)程循環(huán)10次,接著主線(xiàn)程循環(huán)100次,接著有回到子線(xiàn)程循環(huán)10次,
 * 接著再回到主線(xiàn)程循環(huán)100次,如此執(zhí)行50次
 * </pre>
 * @author ketqi
 */
 public class WaitNotifyDemo {
   public static void main(String[] args) {
 
     final Business business = new Business();
     new Thread(new Runnable() {
       @Override
       public void run() {
         for (int i = 1; i <= 50; i++) {
           business.sub(i);
         }
 
       }
     }).start();
 
     for (int i = 1; i <= 50; i++) {
       business.main(i);
     }
   }
 }
 
 class Business {
   private boolean isMainThread = true;
 
   public synchronized void sub(int i) {
     while (!isMainThread) {
       try {
         this.wait();
       } catch (InterruptedException e) {
         e.printStackTrace();
       }
     }
     for (int j = 1; j <= 10; j++) {
       System.out.println("sub thread sequence of " + j + ",loop of " + i);
    }
     isMainThread = false;
     this.notify();
   }
 
  public synchronized void main(int i) {
     while (isMainThread) {
       try {
        this.wait();
       } catch (InterruptedException e) {
         e.printStackTrace();
       }
     }
     for (int j = 1; j <= 100; j++) {
       System.out.println("main thread sequence of " + j + ",loop of " + i);
     }
     isMainThread = true;
     this.notify();
   }
 }

以上就是本文的全部?jī)?nèi)容,希望大家可以喜歡。

相關(guān)文章

  • java線(xiàn)程死鎖代碼示例

    java線(xiàn)程死鎖代碼示例

    這篇文章主要介紹了java線(xiàn)程死鎖代碼示例,分享了一個(gè)簡(jiǎn)單線(xiàn)程死鎖的例子,需要的朋友可以參考下。
    2017-11-11
  • 什么是遞歸?用Java寫(xiě)一個(gè)簡(jiǎn)單的遞歸程序

    什么是遞歸?用Java寫(xiě)一個(gè)簡(jiǎn)單的遞歸程序

    這篇文章主要介紹了什么是遞歸?用Java寫(xiě)一個(gè)簡(jiǎn)單的遞歸程序,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • SpringMVC 重新定向redirect請(qǐng)求中攜帶數(shù)據(jù)方式

    SpringMVC 重新定向redirect請(qǐng)求中攜帶數(shù)據(jù)方式

    這篇文章主要介紹了SpringMVC 重新定向redirect請(qǐng)求中攜帶數(shù)據(jù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java使用ByteArrayOutputStream 和 ByteArrayInputStream 避免重復(fù)讀取配置文件的方法

    Java使用ByteArrayOutputStream 和 ByteArrayInputStream 避免重復(fù)讀取配置文

    這篇文章主要介紹了Java使用ByteArrayOutputStream 和 ByteArrayInputStream 避免重復(fù)讀取配置文件的方法,需要的朋友可以參考下
    2015-12-12
  • 基于mybatis逆向工程的使用步驟詳解

    基于mybatis逆向工程的使用步驟詳解

    下面小編就為大家?guī)?lái)一篇基于mybatis逆向工程的使用步驟詳解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • mybatis mybatis-plus-generator+clickhouse自動(dòng)生成代碼案例詳解

    mybatis mybatis-plus-generator+clickhouse自動(dòng)生成代碼案例詳解

    這篇文章主要介紹了mybatis mybatis-plus-generator+clickhouse自動(dòng)生成代碼案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Spring mvc JSON數(shù)據(jù)交換格式原理解析

    Spring mvc JSON數(shù)據(jù)交換格式原理解析

    這篇文章主要介紹了Spring mvc JSON數(shù)據(jù)交換格式原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • 你真的知道Java中對(duì)象的銷(xiāo)毀嗎

    你真的知道Java中對(duì)象的銷(xiāo)毀嗎

    java自帶垃圾回收機(jī)制,會(huì)自動(dòng)識(shí)別內(nèi)存中不再會(huì)被使用的對(duì)象并將其銷(xiāo)毀,釋放內(nèi)存,下面這篇文章主要介紹了Java中對(duì)象銷(xiāo)毀的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • Springboot項(xiàng)目異常處理及返回結(jié)果統(tǒng)一

    Springboot項(xiàng)目異常處理及返回結(jié)果統(tǒng)一

    這篇文章主要介紹了Springboot項(xiàng)目異常處理及返回結(jié)果統(tǒng)一,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-08-08
  • 關(guān)于Java?中?Future?的?get?方法超時(shí)問(wèn)題

    關(guān)于Java?中?Future?的?get?方法超時(shí)問(wèn)題

    這篇文章主要介紹了Java?中?Future?的?get?方法超時(shí),最常見(jiàn)的理解就是,“超時(shí)以后,當(dāng)前線(xiàn)程繼續(xù)執(zhí)行,線(xiàn)程池里的對(duì)應(yīng)線(xiàn)程中斷”,真的是這樣嗎?本文給大家詳細(xì)介紹,需要的朋友參考下吧
    2022-06-06

最新評(píng)論