我想管理我的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