Chcę zarządzać listą obiektów Futures zwróconych przez mojego TaskExecutor.
mam coś takiegoWątek Java - dziwne Thread.interrupted() i future.cancel (true) zachowanie
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 jest zadaniem, które realizuje wywoływalnym < string> i kontrole na Thread.interrupted) Status
public String call() {
while (true) {
if (Thread.interrupted()) {
break;
}
doSomething();
}
}
(Teraz problemem jest to, że tylko podzbiór Współbieżne wątki zwracają "true" po wywołaniu Thread.interrupted().
assert w removeFutures() zwraca wartość true dla każdej przyszłej, która została usunięta (ja sprawdziłem również isDone() i isCompleted()
Liczba wątków, które są przerywane, jest losowa, ponad 15 uruchomionych wątków czasami 13 jest przerywanych, czasami 2 ...
Naprawdę nie rozumiem, gdzie jest problem, jeśli zadzwonię do future.cancel (true) i to zwróci true ... a następnie sprawdzam Thread.interrupted (to jest wywoływane tylko raz), spodziewam się ten powrót prawda, jak również.
żadnego pomysłu na to, co mi brakuje?
Jestem na kompilacji java 1.6.0_02-B05
dzięki za odpowiedź. jaki jest sens robienia tego? Jeśli Thread.interrupted() zwróci true, przerywam cykl while i zasadniczo zabijam wątek. Problem polega na tym, że czasami Thread.interrupted() zwraca "false", nawet jeśli powiązana future.cancel (true) zwraca true. Edytowana linia nie może być w tym czasie osiągnięta. – marts
Następnie flaga przerwania jest prawdopodobnie zgubiona gdzieś w 'doSomething()' (z tego samego powodu - coś resetuje flagę i nie przywraca). To znaczy, próbka w mojej odpowiedzi jest podstawową zasadą, której należy używać w celu uniknięcia utraconych przerwań. – axtavt
Jeśli tak jest ("unikaj zagubionych przerwań") nie mogę po prostu użyć czegoś takiego jak Thread.currentThread(). IsInterrupted() zamiast konieczności przywracania stanu przerwania za każdym razem, gdy używam Thread.interrupted(). (BTW jest błąd z tym: http://stackoverflow.com/questions/2012259/) Nie mam do czynienia ze stanem przerwania w doSomething. – marts