国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

詳細分析java線程wait和notify

2019-11-26 15:03:15
字體:
供稿:網(wǎng)友

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

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

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

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

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

/** * <pre> * 子線程循環(huán)10次,接著主線程循環(huán)100次,接著有回到子線程循環(huán)10次, * 接著再回到主線程循環(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();   } }

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 甘谷县| 海口市| 南投县| 襄樊市| 改则县| 泾阳县| 陆川县| 讷河市| 台江县| 衢州市| 蓝田县| 阿克苏市| 衡东县| 辽宁省| 祁连县| 新和县| 思茅市| 景洪市| 涟源市| 宜宾县| 松江区| 苏州市| 措勤县| 宝山区| 惠东县| 长治市| 宁津县| 噶尔县| 喜德县| 新营市| 正定县| 万荣县| 盘山县| 霸州市| 分宜县| 新闻| 泾川县| 武定县| 教育| 烟台市| 鹤峰县|