2010/01/13

Java Concurrency(5)

中斷

一個中斷是一個指示給一個thread告訴它應該停止它目前所作的事情然後去做其他事情,這就要看程式設計者決定thread
該如何回應中斷,但是往往是一個thread的終結。這個使用強調在這個課程中。

一個thread發送一個中斷藉由引發(invoke)中斷方法在Thread物件上,為了要讓中斷結構正確,被中斷的thread一定要支援自己的中斷。

支援中斷

一個Thread該如何支援自己的中斷?這依據它現在正在做什麼,如果thread常常引發會丟出InterruptedException
的方法的話,它簡單的被回傳從run方法,當它被抓到了例外,例如說假設中央訊息迴圈在SleepMessage範例中被執行
在Thread的Runnable物件的run方法裡,這將會被修改成如下來支援中斷:
for (int i = 0; i < importantInfo.length; i++) {
    //Pause for 4 seconds
    try {
        Thread.sleep(4000);
    } catch (InterruptedException e) {
        //We've been interrupted: no more messages.
        return;
    }
    //Print a message
    System.out.println(importantInfo[i]);
}
很多方法丟出InterruptedException,例如Sleep, 被設計成取消掉它們目前的工作以及立即地回傳當中斷被收到 萬一有個thread執行長時間而沒有引發任何一個InterrutpedException怎麼辦?那麼他必定要固定時間引發 Thread.interrupted, 回傳true當一個interrupt的發生被接收。
for (int i = 0; i < inputs.length; i++) {
    heavyCrunch(inputs[i]);
    if (Thread.interrupted()) {
        //We've been interrupted: no more crunching.
        return;
    }
}
上面這個簡單的範例測試中斷以及離開thread如果接收到中斷命令,在大多數複雜的應用程式裡,使用 throw InterruptedException是更加直覺的作法:
if (Thread.interrupted()) {
    throw new InterruptedException();
}
中斷狀態旗標(The Interrupt Status Flag) 中斷結構被實做使用一個內部旗標被稱為中斷狀態,引發Thread.interrupt來設定這個旗標,當一個threads檢查到 一個中斷被引發由static方法Thread.interrupted, 中斷狀態就被清除,non-static Thread.isInterrupted 被使用在一個thread去詢問另外一個thread的中斷狀態,並沒有改變中斷狀態旗標。 根據約定,任何方法的離開藉由丟出一個InterruptedException會清除中斷狀態,然而隨時都有可能中斷狀態會立即的 被其他的thread引發interrupt再度設定。

 中斷狀態旗標這部份可能還要再修改翻譯...僅供參考

 參考網址
  http://java.sun.com/docs/books/tutorial/essential/concurrency/interrupt.html

No comments:

Post a Comment