熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java編程語言中notify和wait的具體應用

2013-11-23 18:52:56  來源: Java核心技術 
Java編程語言在應用的時候需要我們不斷的進行相關知識的學習首先我們先要理解notify()和wait()只有理解了這個語句才能更好的進行相關的應用希望大家有所收獲
  
  為什麼在前幾天紀錄線程的時候沒有紀錄這兩個方法呢因為這兩個方法本來就不屬於Thread類而是屬於最底層的object基礎類的也就是說不光是Thread每個對象都有notify和wait的功能為什麼?因為他們是用來操縱鎖的而每個對象都有鎖鎖是每個對象的基礎既然鎖是基礎的那麼操縱鎖的方法當然也是最基礎了
  
  按照Think in Java中的解釋:wait()允許我們將線程置入睡眠狀態同時又積極地等待條件發生改變而且只有在一個notify()或notifyAll()發生變化的時候線程才會被喚醒並檢查條件是否有變
  
  我們來解釋一下這句話
  
  wait()允許我們將線程置入睡眠狀態也就是說wait也是讓當前線程阻塞的這一點和sleep或者suspend是相同的那和sleepsuspend有什麼區別呢?
  
  區別在於(wait)同時又積極地等待條件發生改變這一點很關鍵sleep和suspend無法做到因為我們有時候需要通過同步(synchronized)的幫助來防止線程之間的沖突而一旦使用同步就要鎖定對象也就是獲取對象鎖其它要使用該對象鎖的線程都只能排隊等著等到同步方法或者同步塊裡的程序全部運行完才有機會在同步方法和同步塊中無論sleep()還是suspend()都不可能自己被調用的時候解除鎖定他們都霸占著正在使用的對象鎖不放
  而wait卻可以它可以讓同步方法或者同步塊暫時放棄對象鎖而將它暫時讓給其它需要對象鎖的人(這裡應該是程序塊或線程)用這意味著可在執行wait()期間調用線程對象中的其他同步方法!在其它情況下(sleep啊suspend啊)這是不可能的
  
  但是注意我前面說的在Java編程語言中只是暫時放棄對象鎖暫時給其它線程使用我wait所在的線程還是要把這個對象鎖收回來的呀wait什麼?就是wait別人用完了還給我啊!好那怎麼把對象鎖收回來呢?
  
  第一種方法限定借出去的時間在wait()中設置參數比如wait()以毫秒為單位就表明我只借出去秒中一秒鐘之後我自動收回
  
  第二種方法讓借出去的人通知我他用完了要還給我了這時我馬上就收回來假如我設了小時之後收回別人只用了半小時就完了那怎麼辦呢?靠!當然用完了就收回了還管我設的是多長時間啊
  
  那麼別人怎麼通知我呢?相信大家都可以想到了notify()這就是最後一句話而且只有在一個notify()或notifyAll()發生變化的時候線程才會被喚醒的意思了
  因此我們可將一個wait()和notify()置入任何同步方法或同步塊內部無論在那個類裡是否准備進行涉及線程的處理而且實際上我們也只能在同步方法或者同步塊裡面調用wait()和notify()這個時候我們來解釋上面的程序簡直是易如反掌了
  
  synchronized(b){}在Java編程語言中的意思是定義一個同步塊使用b作為資源鎖bwait();的意思是臨時釋放鎖並阻塞當前線程好讓其他使用同一把鎖的線程有機會執行在這裡要用同一把鎖的就是b線程本身這個線程在執行到一定地方後用notify()通知wait的線程鎖已經用完待notify()所在的同步塊運行完之後wait所在的線程就可以繼續執行
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25920.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.