Mam serię równoległych zadań do uruchomienia. Jeśli któryś z nich się nie powiedzie, chcę im wszystko przerwać i poczekać na zakończenie. Ale zakładając, że żaden z nich nie zawodzi, chcę poczekać, aż wszystkie z nich się skończą.W języku Java, jak mogę czekać na wszystkie zadania, ale zatrzymać na pierwszym błędzie?
Usługa ExecutorCompletionService wygląda prawie tak, jak chcę, ale wydaje się, że nie ma sposobu na stwierdzenie, czy wszystkie moje zadania zostały wykonane, z wyjątkiem sytuacji, w których liczba zadań jest oddzielna. (Zwróć uwagę, że oba przykłady w Javadoc dla ExecutorCompletionService śledzą liczbę "n" zadań i używają jej do określenia, czy usługa została zakończona.)
Czy coś przeoczyłem, czy naprawdę sam musisz napisać ten kod?
Mógł obsłużyć warunek błędu w zadaniu, ale tak, wywołanie get() na Przyszłość jest najlepsze. –
Potrzebuję do iteracji nad zadaniami oczywiście, ale mogę po prostu wziąć() futures od ExecutorCompletionService. (Tak właśnie robi przykład Javadoc.) Problem polega na tym, że nie mogę po prostu wziąć() dopóki nie zabraknie mi zadań, ponieważ jeśli wezmę(), gdy nie będzie już pracy, utknę w nieskończoność. –
Dobrze, więc musisz wstępnie obliczyć liczbę zadań (jak myślałeś) i zrobić to wiele razy. –