Как тайм-аут Future в Java без использования Future.get (), поскольку это операция блокировки? - PullRequest
2 голосов
/ 31 октября 2019

У меня есть список фьючерсов, по которым я продолжаю цикл проверки Future.isDone(), и если да, то я использую Future.get(). Но есть случаи, когда поток продолжается вечно, и чтобы избежать этого, я хочу установить таймаут.

Пожалуйста, помогите мне рассчитать время без использования Future.get() в качестве операции блокировки. Большинство вопросов о тайм-ауте здесь в стеке потока указывают на Future.get() с таймаутом внутри него.

1 Ответ

2 голосов
/ 31 октября 2019

Если вы можете использовать CompletableFuture вместо простого Future, вы можете использовать CompletableFuture.anyOf() метод:

Возвращает новое CompletableFuture, которое завершается, когда любой иззаданный CompletableFutures завершен, с тем же результатом.

CompletableFuture<Void> combinedFuture = 
    CompletableFuture.anyOf(future1, future2, future3); 
combinedFuture.get();

if (future1.isDone()) { ... }
if (future2.isDone()) { ... }
if (future3.isDone()) { ... }

В Java 9 у вас есть дополнительные методы для обработки тайм-аутов, например CompletableFuture.completeOnTimeout().

...