1. JDK 1.0版本中有一個stop方法用于強制中止線程,但是現在這個方法被廢止。因此沒有方法強制中止線程,但是interrupt方法可以要求某個線程的中止。
2. 某個線程的interrupt方法被調用后,該線程被設為中斷狀態,這是一個boolean值,每個線程都應當定期檢查這個值,以知道自己是否被中斷。一個線程被interrupt并不意味著它必須結束,僅僅是發送了一個消息而已。
3. Thread.currentThread().isInterrupted()方法返回一個boolean值,表示是否為中斷狀態。
4. 當某個線程阻滯時(如在sleep wait方法調用后),無法檢查中斷狀態。如果此時interrupt方法被調用,當前的阻滯狀態就會被中止,并且產生InterruptedException。
5. 一個run方法應當有這樣的形式:
public void run() {
try {
//...
while (!Thread.currentThread().isInterrupted() && more work to do) {
//do more work
}
} catch (InterruptedException e) {
//...
}
finally {
//clean up, if required
}
}
如果在線程每個工作段后都使用sleep方法,就不必檢查中斷狀態了,此時只要處理好InterruptedException就行了。
6. 還有一個類似的靜態方法interrupted(),同樣返回一個boolean值,不同的是該方法同時把當前中斷狀態設為了false。
7. 有一個很不好習慣:捕獲InterruptedException后沒有進行任何的處理。如果的確想不到什么事情做,至少可以加上Thread.currentThread().interrupted()改變中斷狀態,以便呼叫者知道這個情況;或者可以開頭聲明throws InterrupedException,并取消try塊,讓呼叫者處理這個問題。
8. 線程的四個狀態:New, Runnable, Blocked, Dead
New狀態:在new Thread(r)被調用后,start方法調用前。做一些初始化工作。
Runaable狀態:start方法調用后。一個線程在運行并不意味著它在不停地運行,事實上,應當不時的中斷,以便其他線程有機會運行。具體細節由操作系統決定。preemptive系統給每個線程一段時間運行,之后暫停該線程,給另一個線程運行的機會。選擇另一個線程時,系統會考慮優先權。但是在cooperative系統中,只有在一個線程sleep或yield時才會交出控制權。
Blocked:以下幾種情況會導致停滯:1)調用sleep方法 2)執行了某個在IO上阻塞的操作 3)試圖獲得正被其他線程控制的lock 4)waits for a conditionsee page 5)其他人調用了該線程的suspend方法,注意這個方法已被廢止。
當一個線程從Blocked中恢復時(如sleep方法設定時間到,IO操作完成等),系統會根據優先級決定是否繼續運行這個線程。
不能簡單地調用線程的resume方法使之從Blocked狀態中恢復。如果要取消因IO操作導致的block,可以讓另一個線程關閉對應的IO通道(channel),則原來那個線程恢復運行,并拋出ClosedChannelException。
Death:run方法結束后線程就進入Death狀態。也可以通過調用線程的stop方法中止該線程運行,會拋出ThreadDeath錯誤。當然,不要在你自己的代碼里使用這個方法。
線程的isAlive()方法返回該線程是否已被中止(也有可能尚未運行)。