Я хочу управлять списком объектов Futures, возвращаемых моим TaskExecutor.
У меня есть что-то вроде этого
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 — это задача, реализующая Callable‹ String> и проверяющая статус Thread.interrupted().
public String call() {
while (true) {
if (Thread.interrupted()) {
break;
}
doSomething();
}
}
Теперь проблема в том, что только подмножество параллельных потоков возвращает «истину» при вызове Thread.interrupted().
Утверждение в removeFutures() возвращает true для каждого удаляемого будущего (я также проверял isDone() и isCompleted()).
Количество прерванных потоков является случайным. Более 15 запущенных потоков иногда 13 прервано, иногда 2 ...
Я действительно не понимаю, в чем проблема, если я вызываю future.cancel(true) и это возвращает true... и затем я проверяю Thread.interrupted (это вызывается только один раз) , я ожидаю, что это также вернет true.
Есть идеи, что я упустил?
Я использую сборку java 1.6.0_02-b05.