Desidero gestire un elenco di oggetti Futures restituiti dal mio TaskExecutor.
Ho qualcosa di simileThread Java - comportamento strano Thread.interrupted() e 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 è un compito che implementa Callable < String> e controlli per Thread.interrupted) Stato
public String call() {
while (true) {
if (Thread.interrupted()) {
break;
}
doSomething();
}
}
(Ora il problema è che solo un sottoinsieme di i Thread simultanei restituiscono 'true' quando viene chiamato Thread.interrupted().
L'affermazione in removeFutures() restituisce true per ogni futuro rimosso (Ho verificato anche isDone() ed isCompleted().
Il numero di thread interrotti è casuale. Più di 15 thread in esecuzione a volte 13 sono interrotti, a volte 2 ...
Io davvero non capisco dove sia il problema, se chiamo future.cancel (true) e questo restituisce true ... e poi controllo Thread.interrupted (questo è chiamato solo una volta), mi aspetto questo per tornare vero pure.
Qualsiasi idea di che cosa mi manca?
sono su di generazione Java 1.6.0_02-b05
grazie per la vostra risposta. qual è il punto di fare questo? Se Thread.interrupted() restituisce true, interrompo il ciclo while e fondamentalmente uccido il thread. Il problema è che a volte Thread.interrupted() restituisce 'false' anche se il relativo future.cancel (true) restituisce true. La linea che hai modificato non può nemmeno essere raggiunta in quel momento. – marts
Quindi il flag di interruzione è probabilmente perso da qualche parte in 'doSomething()' (per lo stesso motivo - qualcosa reimposta il flag e non ripristina in). Cioè, campione nella mia risposta è un principio di base che dovrebbe essere usato per evitare interruzioni perse – axtavt
Se questo è il caso ('evitare interruzioni perse') non potrei semplicemente usare qualcosa come Thread.currentThread(). IsInterrupted() invece di dover ripristinare lo stato di interruzione ogni volta che utilizzo Thread.interrupted(). (A proposito c'è un bug con questo: http://stackoverflow.com/questions/2012259/) Non ho a che fare con lo stato di interruzione in doSomething. – marts