要想讨論正确處理interrupedtexception的方法,就要知道interruptedexception是什麼。
根據java doc的定義
thrown when a thread is waiting, sleeping, or otherwise occupied, and the thread is interrupted, either before or during the activity. occasionally a method may wish to test whether the current
thread has been interrupted, and if so, to immediately throw this exception.
意思是說當一個線程處于等待,睡眠,或者占用,也就是說阻塞狀态,而這時線程被中斷就會抛出這類錯誤。java6之後結束某個線程a的方法是a.interrupt()。如果這個線程正處于非阻塞狀态,比如說線程正在執行某些代碼的時候,不過被interrupt,那麼該線程的interrupt變量會被置為true,告訴别人說這個線程被中斷了(隻是一個标志位,這個變量本身并不影響線程的中斷與否),而且線程會被中斷,這時不會有interruptedexception。但如果這時線程被阻塞了,比如說正在睡眠,那麼就會抛出這個錯誤。請注意,這個時候變量interrupt沒有被置為true,而且也沒有人來中斷這個線程。比如如下的代碼:
while(true){
try {
thread.sleep(1000);
}catch(interruptedexception ex)
{
logger.error("thread interrupted",ex);
}
}
當線程執行sleep(1000)之後會被立即阻塞,如果在阻塞時外面調用interrupt來中斷這個線程,那麼就會執行
logger.error("thread interrupted",ex);
這個時候其實線程并未中斷,執行完這條語句之後線程會繼續執行while循環,開始sleep,是以說如果沒有對interruptedexception進行處理,後果就是線程可能無法中斷
是以,在任何時候碰到interruptedexception,都要手動把自己這個線程中斷。由于這個時候已經處于非阻塞狀态,是以可以正常中斷,最正确的代碼如下:
while(!thread.isinterrupted()){
thread.interrupt()
這樣可以保證線程一定能夠被及時中斷。
對于更為複雜的情況,除了要把自己的線程中斷之外,還有可能需要抛出interruptedexception給上一層代碼