Ожидание любого будущего в Java 8 без создания потока на будущее - PullRequest
0 голосов
/ 23 февраля 2020

У меня есть коллекция фьючерсов, и я хотел бы подождать любого из них, то есть иметь блокирующий вызов, который будет возвращаться после завершения любого будущего.

Я видел CompletableFuture.anyOf(), но если я понял его код правильно он создает поток на будущее, я хотел бы использовать менее расточительный подход с точки зрения ресурсов, если это возможно в Java.

1 Ответ

1 голос
/ 23 февраля 2020

Прямой ответ - да, вот пример метода

    private <T> CompletableFuture<T> waitAny(List<CompletableFuture<T>> allFutures) throws InterruptedException {
        Thread thread = Thread.currentThread();
        while (!thread.isInterrupted()) {
            for (CompletableFuture<T> future : allFutures) {
                if (future.isDone()) {
                    return future;
                }
            }
            Thread.sleep(50L);
        }
        throw new InterruptedException();
    }

Второй вариант

    private <T> CompletableFuture<T> waitAny(List<CompletableFuture<T>> allFutures) throws InterruptedException {
        CompletableFuture<CompletableFuture<T>> any = new CompletableFuture<>();
        for (CompletableFuture<T> future : allFutures) {
            future.handleAsync((t, throwable) -> {
                any.complete(future);
                return null;
            });
        }
        try {
            return any.get();
        } catch (ExecutionException e) {
            throw new IllegalStateException(e);
        }
    }

, но весь контекст задачи неясен, возможно, существует более оптимальное решение.

...