我想管理我的TaskExecutor返回的期貨對象列表。
我有這樣的事情Java線程 - 奇怪的Thread.interrupted()和future.cancel(true)行爲
List<Future<String>> list
void process(ProcessThis processThis) {
for (...) {
Future<String> future = taskExecutor.submit(processThis);
list.add(future)
}
}
void removeFutures() {
for(Future future : list) {
assert future.cancel(true);
}
ProcessThis是,Thread.interrupted實現可贖回<字符串>並檢查任務()狀態
public String call() {
while (true) {
if (Thread.interrupted()) {
break;
}
doSomething();
}
}
現在的問題是,只有一個子集併發線程在調用Thread.interrupted()時返回'true'。
removeFutures()中的斷言對於每個將來的刪除都會返回true(我同時檢查了isDone()和isCompleted()
中斷的線程數是隨機的超過15個正在運行的線程有時會被中斷,有時候是2 ...
我真的不明白問題在哪裏,如果我調用future.cancel(true)並返回true,然後檢查Thread.interrupted(這隻會被調用一次),我期望這回也是如此。
我失去了什麼的任何想法?
我在構建Java 1.6.0_02-B05
感謝您的回覆。這樣做有什麼意義?如果Thread.interrupted()返回true我打破了while循環,我基本上殺死了線程。問題是,即使相關的future.cancel(true)返回true,有時Thread.interrupted()也會返回'false'。您編輯的行當時甚至無法達到。 – marts
然後中斷標誌可能在'doSomething()'的某個地方丟失(出於同樣的原因 - 重置標誌並且不恢復)。也就是說,我的回答中的示例是一個基本原則,應該用來避免丟失中斷 – axtavt
如果是這種情況('避免丟失中斷'),我不能只使用像Thread.currentThread()。isInterrupted()而不是每次使用Thread.interrupted()都必須恢復中斷狀態。 (順便說一句,這是一個錯誤:http://stackoverflow.com/questions/2012259/)我沒有處理doSomething中的中斷狀態。 – marts