gpt4 book ai didi

Java CompletableFuture.anyOf(manyfutures).thenRun( runnable ) 只运行一次

转载 作者:行者123 更新时间:2023-12-01 17:01:27 32 4
gpt4 key购买 nike

我在做

CompletableFuture.anyOf(manyfutures).thenRun( new Runnable() { } }

但是runnable中的代码只运行一次!我预计它会运行很多次,每次任何 future 完成时。

如何在每次任何 future 完成时运行一段代码?以最佳方式,这意味着这是行不通的:

    public static void append(final CompletableFuture[] futures, Runnable runnable) {
for (CompletableFuture future : futures) {
future.thenRun(runnable);
}
}

编辑

我正在使用 ThreadPoolExecutor,当执行 X 个可运行对象时,我想向其追加更多工作。

有没有办法倾听这种情况并在发生这种情况时提供更多工作?

另一种选择是我在一开始就堆叠数千项工作,但这也不是最佳选择。

我在做

... queue = new LinkedBlockingQueue<Runnable>(); 
new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, queue);

最佳答案

看看 JavaDoc

Returns a new CompletableFuture that is completed when any of the given CompletableFutures complete, with the same result. Otherwise, if it completed exceptionally, the returned CompletableFuture also does so, with a CompletionException holding this exception as its cause. If no CompletableFutures are provided, returns an incomplete CompletableFuture.

任何给定的 CompletableFutures 时,该方法返回完全的。即第一个。一个方法不能多次返回。

每个之后运行一个操作CompletableFuture只需调用theRunthenRunAsync 每个 CompletableFuture .

如果您有 List<CompletableFuture<T>>你想要一个CompletableFuture<List<T>> ,即您想要将 future 集合“展开”为集合的 future,您可以使用以下技巧:

private static <T> CompletableFuture<List<T>> sequence(List<CompletableFuture<T>> futures) {
final CompletableFuture<Void> allDoneFuture = CompletableFuture.allOf(futures.toArray(new CompletableFuture[futures.size()]));
return allDoneFuture.thenApply(v ->
futures.stream().
map(future -> future.join()).
collect(toList())
);
}

取自 this article on the usage of CompletableFuture

关于Java CompletableFuture.anyOf(manyfutures).thenRun( runnable ) 只运行一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27462465/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com