也談線程的休眠與等待
關(guān)于線程間的交互和共享數(shù)據(jù)通常有輪詢和通知機(jī)制。一下舉例說(shuō)明:Thread1和Thread2共享一塊數(shù)據(jù)ShareData,Thread1使用數(shù)據(jù),Thread2更新數(shù)據(jù)。當(dāng)Thread1使用數(shù)據(jù)時(shí)發(fā)現(xiàn)數(shù)據(jù)沒(méi)有更新就可以先休眠(sleep())一段時(shí)間然后再去判斷是否更新,如此反復(fù)直到數(shù)據(jù)可用,這就是所述的輪詢機(jī)制。可以看出輪詢機(jī)制需要不斷的輪詢數(shù)據(jù)狀態(tài),很耗費(fèi)資源;當(dāng)采用通知機(jī)制時(shí)過(guò)程是這樣的,Thread1發(fā)現(xiàn)數(shù)據(jù)不可用就在ShareData上等待(ShareData.wait()),當(dāng)Thread2更新數(shù)據(jù)后就通知所有在ShareData上等待的線程(ShareData.notifyAll()),這樣Thread1受到通知繼續(xù)運(yùn)行。
關(guān)于等待和休眠還有另一個(gè)區(qū)別就是當(dāng)線程等待時(shí),該線程鎖定的資源是釋放掉的,這時(shí)其它線程是可以鎖定這些資源的,當(dāng)線程被喚醒或者等待時(shí)限到時(shí)線程重新獲取資源才能繼續(xù)運(yùn)行;而當(dāng)線程休眠時(shí)線程鎖定的資源是不被釋放的。
還有一點(diǎn)就是要在對(duì)象lock上等待時(shí)是必須先要獲取lock的對(duì)象鎖才能進(jìn)行的,即必須要類似下面的邏輯
synchronized(lock){ lock.wait()}
以下為一個(gè)簡(jiǎn)單的示例:
package
sinpo.usagedemo;
|
posted on 2008-10-22 23:26 徐辛波 閱讀(1276) 評(píng)論(0) 編輯 收藏 所屬分類: source pieces