2 回答

TA貢獻(xiàn)1712條經(jīng)驗(yàn) 獲得超3個(gè)贊
您可能希望有一個(gè)Task class
(擴(kuò)展或包裝Runnable
)實(shí)現(xiàn)中斷機(jī)制(例如boolean
標(biāo)志)的線程,而不是干擾線程。
當(dāng)你執(zhí)行你的任務(wù)時(shí),你需要定期檢查這個(gè)標(biāo)志,如果它被設(shè)置,任務(wù)應(yīng)該停止它正在做的事情。此時(shí)您可能想要返回一個(gè)特定的結(jié)果,告訴您的代碼任務(wù)已成功取消。
如果用戶現(xiàn)在決定不再需要此任務(wù)的結(jié)果,則必須設(shè)置此標(biāo)志。然而,此時(shí)任務(wù)可能已經(jīng)完成,因此您仍然需要處理結(jié)果已經(jīng)存在但用戶不再關(guān)心它的情況。
線程級(jí)別的中斷并不能保證線程停止工作。這僅在線程處于可以接收interrupt
.
此外,您不應(yīng)直接干擾 的線程ExecutorSerivce
,因?yàn)槟赡軙?huì)無(wú)意中停止不同的任務(wù)或停止ExecutorSerivce
正常工作。

TA貢獻(xiàn)1826條經(jīng)驗(yàn) 獲得超6個(gè)贊
您為什么要終止該任務(wù)并繼續(xù)執(zhí)行下一個(gè)任務(wù)?如果是時(shí)間問(wèn)題,您可以定義比您在執(zhí)行它們的方法中聲明的時(shí)間更長(zhǎng)的線程將被自動(dòng)取消。例如:
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.invokeAll(Arrays.asList(new Task()), 60, TimeUnit.SECONDS); // Timeout of 60 seconds.
executor.shutdown();
如果任何線程花費(fèi)的時(shí)間超過(guò) 60 秒,它將拋出一個(gè)cancellation.Exception()你必須捕獲的
添加回答
舉報(bào)