也談線程的休眠與等待

          關(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;

          /**
            * 該例子說(shuō)明線程休眠與等待以及注意事項(xiàng)。
           
            @author  徐辛波(sinpo.xu@hotmail.com) 
            * Oct 22, 2008
            */
          public class  PendingThreadDemo  {
               public  Console console =  new  Console () ;
               private  void  writeToConsole1 () {
                   synchronized ( console ){
                       try  {
                           Thread.sleep ( 1000 ) ; //NOTE:sleep時(shí)并未釋放console別的線程是不能鎖定console的
                           //TODO do things
                       catch  ( InterruptedException e ) {
                           e.printStackTrace () ;
                       }
                   }
               }
              
               private  void  writeToConsole2 () {
                   synchronized ( console ){
                       try  {
                           console.wait ( 1 * 1000 ) ; //NOTE:wait時(shí)別的線程是可以鎖定console的
                           //TODO do things
                       catch  ( InterruptedException e ) {
                           e.printStackTrace () ;
                       }
                   }
               }
          }
          //控制臺(tái)類
          class  Console  {
               //TODO implements me
          }

          posted on 2008-10-22 23:26 徐辛波 閱讀(1276) 評(píng)論(0)  編輯  收藏 所屬分類: source pieces

          導(dǎo)航

          <2008年10月>
          2829301234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          統(tǒng)計(jì)

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          最新隨筆

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 张北县| 沈阳市| 怀来县| 电白县| 连山| 独山县| 钟祥市| 固安县| 莱州市| 西贡区| 松阳县| 新乡市| 宁津县| 九江县| 县级市| 秦皇岛市| 慈溪市| 巴彦淖尔市| 依兰县| 图木舒克市| 太原市| 金塔县| 通渭县| 宁陵县| 宣城市| 民和| 周至县| 邵武市| 天水市| 望城县| 阿荣旗| 嘉鱼县| 佛坪县| 厦门市| 蓝山县| 陕西省| 油尖旺区| 舟山市| 潜山县| 分宜县| 娄底市|