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

Java中斷線程的方法

2013-11-23 19:58:47  來源: Java高級技術 

  Threadstop Threadsuspend Threadresume 和RuntimerunFinalizersOnExit 這些終止線程運行的方法已經被廢棄使用它們是極端不安全的!

  現在如果你要安全有效地終止一個線程應該采用以下這些方法

   線程正常執行完畢正常結束

  也就是讓run方法執行完畢該線程就會正常結束

   監視某些條件結束線程的不間斷運行

  然而常常有些線程是伺服線程它們需要長時間的運行只有在外部某些條件滿足的情況下才能關閉這些線程

  通常它們執行在一個while(true)的死循環中

  如:

publicvoid run() {
      
       while(true){
           someWork();
           if(finished){
              break;
           }
           try {
              Threadsleep();
           } catch (InterruptedException e) {
              /* TODO自動生成 catch 塊
               *
               */
              eprintStackTrace();
           }
       }
 
   }

  我們可以在while死循環內每次循環時察看外部條件看看是否需要關閉當前線程如果是就break跳出死循環或者是拋出異常跳出死循環結束線程

   捕獲InterruptedException 運行時異常中斷當前線程

  有些執行伺服任務的線程在while(true)這樣的死循環內部是一個阻塞中的方法此時就不能采用第二種方法了因為當該方法沒有返回時該線程一直處於阻塞當中根本無法執行其他語句

  此時就需要調用該線程的interrupt方法產生一個InterruptedException運行時異常是阻塞中的那個方法拋出這個異常從而讓我們有機會結束這個線程的執行

  如

publicvoid run() {
while(true){
           try {
// getSendMessages 是BlockingQueue類它的take方法將會阻塞!
              responseMessage = thisgetSendMessages()take();
           } catch (InterruptedException e) {
   
              thrownew RuntimeException();
//或者break;
           }
           someWork();
      
    }

  一個外部的Thread 對象 指向這個線程 需要結束這個線程時只需要調用thread對象的interrupt() 方法就會在responseMessage = thisgetSendMessages()take()

  這條語句中產生一個InterruptedException異常從而結束該線程的阻塞狀態通過拋出異常或者break跳出死循環結束這個線程


From:http://tw.wingwit.com/Article/program/Java/gj/201311/27772.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.