夢想飛翔

          自強不息
          posts - 111, comments - 30, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          1.2中斷線程

          Posted on 2009-02-25 14:29 love1563 閱讀(212) 評論(0)  編輯  收藏 所屬分類: Java語言*高級版

                  線程將在它的run方法返回時終止。在    JDK1.0中,還存在一個stop方法,其他線程可以調用它來終止線程。不過這個方法現在已經被棄用了。
                  盡管現在已經沒有強制終止線程的方法了,但是你還是可以用interrupt方法來請求終止一個線程。

                  當interrupt方法在一個線程上被調用時,該線程的中斷狀態(interrupted status)將會被置位。這是一個布爾型的標志,存在于每一個線程之中。每個線程都應該不時地檢查這個標志,已判斷線程是否應該被中斷。
                  為了查明中斷狀態是否被置位了,需要首先調用靜態的thread.currentThread方法來取得當前線程,然后調用它的isInterrupted方法:
                  
          while(!Thread.currentThread().isInterrupted()&&more work to do)
          {
               
          do more work
          }
                  盡管如此,如果一個線程被阻塞了,它就無法檢查中斷狀態了。這就是產生InterruptedException異常的地方。當在一個被阻塞的線程上調用interrupt()方式時,阻塞調用(例如sleep或者wait)就會被InterruptedException異常終止。
                  沒有任何語言方面的需求要求一個被中斷的線程應該終止。中斷一個線程只是為了引起該線程的注意,被中斷線程可以決定如何應對中斷。某些線程非常重要,以至于它們應該不理會中斷,而是在處理完拋出的異常之后繼續執行。但是更普遍的情況是,一個線程將把中斷看做一個終止請求。這種線程的run()方法遵循如果的形式:

                  
              public void run()
              
          {
                 
          try {
                  .
                  
                  
          while (Thread.currentThread().isInterrupted() && more work to do{

                      
          do more work
                  }

              }
           catch (InterruptedException e) {
                  Thread was interrupted during sleep or wait
              }
           finally{
                  cleanup 
          if required
              }

              
          //exiting the run method terminates the thread
              }
                      如果你在每次工作迭代之后都調用sleep方法,那么這個inIterrupted檢查就不是必須的。如果你在中斷狀態被置位時調用sleep方法,那么sleep方法將拋出一個InterruptedException異常。因此,如果你循環調用sleep,就要花點心思檢查中斷狀態并捕獲
          InterruptedException異常。這樣的run方法的形式如下所示:
              public void run()
              
          {
                 
          try {
                  .
                  
                  
          while (more work to do{

                      
          do more work
                      Thread.sleep(delay);
                  }

              }
           catch (InterruptedException e) {
                  Thread was interrupted during sleep or wait
              }
           finally{
                  cleanup 
          if required
              }

              
          //exiting the run method terminates the thread
              }

           

                  當sleep方法拋出一個InterruptedException異常時,它同時也會清除中斷狀態。
                  你會在很多發布的代碼中發現InterruptedException異常被抑制在了一個很低的層次上,就像這樣:

          public void mySubTask()
              
          {
                 
          try {
                          Thread.sleep(delay);
                  }

              }
           catch (InterruptedException e) {}//don't ignore
                  
              }

                  不要這樣做!如果你不能很好地在catch字句中來處理異常,那么你還又兩個合理的選擇:
                  1)在catch字句中,調用Thread.currentThread().interrupt()來設置中斷狀態。然后調用者可以對其進行測試:

          public void mySubTask()
              
          {
                 
          try {
                          Thread.sleep(delay);
                  }

              }
           catch (InterruptedException e) {Thread.currentThread().interrupt()}
                  
              }

           

                  2)或者更好的方法,標記你的方法將拋出InterruptedException異常,讓調用(或者,最終的run方法)就能夠捕獲該異常。

              public void mySubTask() throws InterruptedException
              
          {
                          Thread.sleep(delay);
              }
                線程如果中斷后再休眠則會修改中斷狀態。

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 阳高县| 龙山县| 尚义县| 延川县| 西宁市| 石城县| 台北县| 西青区| 武威市| 湟中县| 景谷| 安吉县| 衡阳市| 阳朔县| 梁山县| 团风县| 莒南县| 冀州市| 观塘区| 洪江市| 永济市| 榕江县| 即墨市| 北京市| 高州市| 房山区| 武冈市| 三河市| 偃师市| 乌鲁木齐市| 苏尼特右旗| 姚安县| 清苑县| 铅山县| 开江县| 临潭县| 昌平区| 海兴县| 洪江市| 顺昌县| 内乡县|