使用標(biāo)志停止線程的壞處在于,如果線程正在等待或處于休眠狀態(tài),則必須等待它完成等待/休眠。如果您調(diào)用線程上的中斷方法,那么這將導(dǎo)致等待或睡眠調(diào)用與InterruptedException一起退出。
(標(biāo)志方法的第二個(gè)缺點(diǎn)是,大多數(shù)非平凡的代碼都將使用java.util.current這樣的庫(kù),其中的類是專門(mén)設(shè)計(jì)用來(lái)使用中斷來(lái)取消的。在傳遞給Executir的任務(wù)中使用手搖標(biāo)志將很尷尬。)
調(diào)用中斷()還設(shè)置一個(gè)中斷屬性,您可以使用該屬性作為標(biāo)志來(lái)檢查是否退出(在線程沒(méi)有等待或休眠的情況下)。
您可以編寫(xiě)線程的Run方法,以便在線程正在執(zhí)行的循環(huán)邏輯之外捕獲InterruptedException,或者在循環(huán)中捕獲異常并接近拋出異常的調(diào)用,為InterruptedException在CATCH塊中設(shè)置中斷標(biāo)志,這樣線程就不會(huì)忘記它被中斷的事實(shí)。中斷的線程仍然可以根據(jù)自己的條件保持控制和完成處理。
假設(shè)我想編寫(xiě)一個(gè)確實(shí)以增量方式工作的工作線程,其中由于某種原因在中間有睡眠,而且我不希望放棄睡眠以使處理退出而不為該增量執(zhí)行剩余的工作,我只希望它在增量之間的情況下退出:
class MyThread extends Thread{
public void run()
{
while (!Thread.currentThread().isInterrupted())
{
doFirstPartOfIncrement();
try {
Thread.sleep(10000L);
} catch (InterruptedException e) {
// restore interrupt flag
Thread.currentThread().interrupt();
}
doSecondPartOfIncrement();
}
}}
下面是一個(gè)類似問(wèn)題的答案,包括示例代碼。