標籤:
這一篇咋們繼續,接著來介紹wait()和notify()方法,我們都知道這兩個方法和之前介紹的方法不太一樣,那就是這兩個方法是對象Object上的,不屬於Thread類上的。我們也知道這兩個方法是實現多個線程之間的通訊和互斥的,不多說了,下面就來看一下例子吧:
例子描述:
開啟兩個線程,子線程迴圈10次,主線程迴圈100次,如此反覆迴圈50次
代碼如下:
public static void main(String[] args) { final Business business = new Business(); //子線程迴圈10次 new Thread(new Runnable(){ @Override public void run() { for(int i=0;i<50;i++){ business.sub(i); } } }).start(); //主線程迴圈100次 for(int i=0;i<50;i++){ business.main(i); } } /** * 商務邏輯類 * @author weijiang204321 * */ static class Business{ private volatile boolean bShouldSub = true;//true表示sub執行,false表示main執行 public synchronized void sub(int i){ //將這裡的if改成while,效果更好,while會再次判斷,安全性高 //因為有時候線程可能被假喚醒 while(!bShouldSub){ try { //等待 this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } for(int j=0;j<=10;j++){ System.out.println("sub thread sequece of" + j + ",loop of"+i); } bShouldSub = false; this.notify();//喚醒該鎖的等待線程 } public synchronized void main(int i){ while(bShouldSub){ try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } for(int j=0;j<=100;j++){ System.out.println("main thread sequece of" + j + ",loop of"+i); } bShouldSub = true; this.notify(); } } }
通過wait和notify機制來實現這兩個線程的迴圈的有序性,能夠保證子線程迴圈10次,主線程迴圈100次這樣交替運行。
運行結果很多,這裡就不了!這裡我們也是可以看到的,調用wait方法是會釋放鎖的,所以他會被用到很多,這個和之前的幾個方法是不同的!
注意的兩點:
第一:同步代碼塊中的鎖和調用wait和notifiy方法的對象鎖一定要是同一個。
第二:wait和notify方法的調用一定要在同步代碼塊中,不然會報異常,可以自行測試一下。
轉至:http://blog.csdn.net/jiangwei0910410003/article/details/19962565
Java中的對象Object方法之---wait()和notifiy()