程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 具體剖析java線程wait和notify

具體剖析java線程wait和notify

編輯:關於JAVA

具體剖析java線程wait和notify。本站提示廣大學習愛好者:(具體剖析java線程wait和notify)文章只能為提供參考,不一定能成為您想要的結果。以下是具體剖析java線程wait和notify正文


wait()和notify()是直接附屬於Object類,也就是說,一切對象都具有這一對辦法。初看起來這非常 弗成思議,然則現實上倒是很天然的,由於這一對辦法壅塞時要釋放占用的鎖,而鎖是任何對象都具有的,挪用隨意率性對象的 wait() 辦法招致線程壅塞,而且該對象上的鎖被釋放。而挪用隨意率性對象的notify()辦法則招致因挪用該對象的wait() 辦法而壅塞的線程中隨機選擇的一個消除壅塞(但要比及取得鎖後才真正可履行)。

其次,wait()和notify()可在任何地位挪用,然則這一對辦法卻必需在 synchronized 辦法或塊中挪用,來由也很簡略,只要在 synchronized 辦法或塊中以後線程才占領鎖,才有鎖可以釋放。異樣的事理,挪用這一對辦法的對象上的鎖必需為以後線程所具有,如許才有鎖可以 釋放。是以,辦法挪用必需放置在如許的 synchronized 辦法或塊中,該辦法或塊的加鎖對象就是挪用這些辦法的對象。若不知足這一條 件,則法式固然仍能編譯,但在運轉時會湧現IllegalMonitorStateException 異常。

 wait() 和 notify() 辦法的上述特征決議了它們常常和synchronized 辦法或塊一路應用,將它們和操作體系的過程間通訊機制造 一個比擬就會發明它們的類似性:synchronized辦法或塊供給了相似於操作體系原語的功效,它們的履行不會遭到多線程機制的攪擾,而這一對辦法則 相當於 block 和wakeup 原語(這一對辦法均聲明為 synchronized)。它們的聯合使得我們可以完成操作體系上一系列精巧的過程間 通訊的算法(如旌旗燈號量算法),並用於處理各類龐雜的線程間通訊成績。
 

關於 wait() 和 notify() 辦法最初再解釋兩點:
    第一:挪用 notify() 辦法招致消除壅塞的線程是從因挪用該對象的 wait() 辦法而壅塞的線程中隨機拔取的,我們沒法預感哪個線程將會被選擇,所以編程時要特殊當心,防止因這類不肯定性而發生成績。
    第二:除 notify(),還有一個辦法 notifyAll() 也可起到相似感化,獨一的差別在於,挪用 notifyAll() 辦法將把因調 用該對象的 wait() 辦法而壅塞的一切線程一次性全體消除壅塞。固然,只要取得鎖的那一個線程能力進入可履行狀況。

相干wait和notify應用demo:

/**
 * <pre>
 * 子線程輪回10次,接著主線程輪回100次,接著有回到子線程輪回10次,
 * 接著再回到主線程輪回100次,如斯履行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();
   }
 }

以上就是本文的全體內容,願望年夜家可以愛好。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved