Ho un set di Futures
creato inviando Callable
s a un Executor
. Pseudo codice:Timeout in attesa del completamento di un lotto di futures?
for all tasks
futures.add(executor.submit(new callable(task)))
Ora mi piacerebbe ottenere tutti i futures in attesa al massimo n secondi fino al completamento. So che posso chiamare lo Future#get(timeout)
ma se lo chiamo in sequenza per tutti i miei futuri in un ciclo, i timout iniziano a sommarsi. pseudo codice:
for all futures
future.get(timeout)
get
blocchi con un timeout finché il risultato è pronto. Pertanto, se il primo viene completato prima del timeout e il secondo viene completato anche prima del timeout e così via, l'intero tempo di esecuzione è number of futures * timeout
al massimo anziché timeout
.
Quindi, sto cercando un metodo che accetta un elenco di Future
s e un timeout, viene eseguito tutto in parallelo e quindi restituisce una raccolta di risultati futuri. Qualche idea?
Questo non è completamente chiaro. Cosa vuoi che succeda alle attività che non sono state completate quando scade il timeout? Vuoi che vengano cancellati o autorizzati a continuare? –
Dovrebbero essere cancellati. Inoltre, in qualche modo ho bisogno di sapere quali sono stati completati e quali no. Immagino che potrei ripetere ancora una volta il futuro e invocare "isDone" su tutti loro. –