Quiero administrar una lista de objetos futuros devueltos por mi TaskExecutor.
tengo algo como estoJava Thread - Thread Thread.interrupted() y future.cancel (true) behavior
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 es una tarea que se puede llamar implementa < cuerda> y cheques por Thread.interrupted() Estado
public String call() {
while (true) {
if (Thread.interrupted()) {
break;
}
doSomething();
}
}
Ahora el problema es que sólo un subconjunto de los Threads concurrentes vuelven a 'verdadero' cuando se invoca Thread.interrupted().
La afirmación en removeFutures() devuelve verdadero para cada futuro que se elimine (también compruebo isDone() y isCompleted()
El número de subprocesos que se interrumpen es aleatorio. Más de 15 subprocesos en ejecución a veces se interrumpen 13, a veces 2 ...
Realmente no entiendo dónde está el problema. Si llamo a future.cancel (verdadero) y esto devuelve cierto ... y luego reviso Thread.interrupted (esto se llama solo una vez), espero esto para volver cierto.
Cualquier idea de lo que me estoy perdiendo?
estoy en construcción java 1.6.0_02-b05
gracias por su respuesta. ¿De qué sirve hacer esto? Si Thread.interrupted() devuelve true, rompo el ciclo while y básicamente elimino el hilo. El problema es que a veces Thread.interrupted() devuelve 'false' incluso si el future.cancel (true) relacionado devuelve true. La línea que editó no puede ser alcanzada en ese momento. – marts
Entonces la bandera de interrupción probablemente se pierda en algún lugar de 'doSomething()' (por la misma razón: algo restablece la bandera y no se restaura en). Es decir, la muestra en mi respuesta es un principio básico que debe usarse para evitar interrupciones perdidas – axtavt
Si ese es el caso ('evitar interrupciones perdidas') ¿no podría simplemente usar algo como Thread.currentThread(). IsInterrupted() en lugar de tener que restaurar el estado de interrupción cada vez que uso Thread.interrupted(). (Por cierto, hay un error con esto: http://stackoverflow.com/questions/2012259/) No estoy tratando con el estado de interrupción en doSomething. – marts