Mam zestaw Futures
utworzony przez przesłanie Callable
s do Executor
. Pseudo kod:Limit czasu w oczekiwaniu na zakończenie partii kontraktów Futures?
for all tasks
futures.add(executor.submit(new callable(task)))
Teraz chciałbym, aby wszystkie futures czekały najwyżej n sekund, aż wszystkie zostaną zakończone. Wiem, że mogę zadzwonić pod numer Future#get(timeout)
, ale jeśli zadzwonię do niego sekwencyjnie dla wszystkich moich przyszłości w pętli, zaczynają się dodawać timery. pseudokod:
for all futures
future.get(timeout)
get
bloki z timeout aż do wyniku jest gotowy. Dlatego też, jeśli pierwszy kończy się tuż przed przekroczeniem limitu czasu, a drugi kończy się tuż przed przekroczeniem limitu czasu, a więc cały czas wykonywania wynosi co najwyżej number of futures * timeout
zamiast timeout
.
Dlatego szukam metody, która akceptuje listę Future
s i limit czasu, działa wszystko równolegle, a następnie zwraca kolekcję przyszłych wyników. Jakieś pomysły?
Nie jest to całkowicie jasne. Co chcesz zrobić z zadaniami, które nie zakończyły się po upływie czasu oczekiwania? Czy chcesz je anulować lub zezwolić na kontynuację? –
Powinny one zostać anulowane. Poza tym muszę wiedzieć, które zostały zakończone, a które nie. Sądzę, że mógłbym powtórzyć raz jeszcze o przyszłości i przywołać 'isDone' na wszystkich z nich. –