Java - 多執行緒中,當中斷thread後,接著需如何做處理?

中斷作用:當thread進入Blocked狀態後,被「中斷(interrupt)」後,便會離開Blocked狀態。

以下大致導讀一篇(https://www.ibm.com/developerworks/java/library/j-jtp05236/)「在中斷後如何做處理」的不同方式:

  • 當呼叫interrupt()時,被中斷的thread不一定需馬上做中斷,而是能進行處理(如關I/O)後再中斷thread
  • 在大型應用程式中,用「cancel」手法處理中斷是較理想做法。
  • 被中斷後,在不同情境下,需要做不同收尾的動作:(Listing系列請見連結中對應的例子)
    • Listing 1. Propagating InterruptedException to callers by not catching it
      => 中斷後,直接拋出例外。

    • Listing 2. Performing task-specific cleanup before rethrowing InterruptedException
      => 中斷後,做一些處理再拋出例外。像此例裡,因遊戲要兩人配對,一旦配對到一半未成功,需還原已被抓出來配對的人。

    • Listing 3. Restoring the interrupted status after catching InterruptedException
      => 有時因threadtask是被Runnable定義,且呼叫interruptable的方法,使得無法做rethrow例外。此時需要保存被中斷的證據。在此例裡,選擇reinterrupt當前的thread,而非拋例外。

    • Listing 4. Swallowing an interrupt -- don't do this
      => 除非是Listing 5的情形,不然絕不能私吞例外。如果用「記log方式」也視為私吞例外,因為在中斷發生時,不僅call stack找不到中斷情形,且查看log行為也已經太遲去為中斷情形做處理了。

    • Listing 5. Interrupts can be swallowed if you know the thread is about to exit
      => 這是唯一能允許私吞例外的情形。當知道該thread已要執行結束離開了,且當呼叫的中斷方法是屬於Thread一部分,而非屬於Runnablegeneral-purposelibrary code

    • Listing 6. Noncancelable task that restores interrupted status before returning
      => 有些task單純只是拒絕被中斷,所以不能做cancel手法。但是保存被中斷的證據仍是必要的。

    • 在「Noninterruptible blocking」標題這一段中說明:並非所有的方法皆會拋出中斷例外。像input streamoutput streamclasses就需要blockI/O完成,就不會拋出中斷例外。

留言

熱門文章