我有一个期货集合,我想等待其中的任何一个,这意味着有一个阻塞呼叫将在完成任何期货后返回。

我看到了CompletableFuture.anyOf(),但是如果我正确地理解了它的代码,它将在将来创建一个线程,如果可能的话,我想在资源方面使用一种较少浪费的方法。

最佳答案

直接答案是肯定的,这是一个示例方法

    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);
        }
    }



但是任务的整体背景尚不清楚,
可能会有更多的最佳解决方案。

关于java - 等待Java 8中的任何将来而不必每个将来都创建线程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60362290/

10-09 03:57