gpt4 book ai didi

java - 从 completablefuture 中检索 runnable 实例

转载 作者:行者123 更新时间:2023-12-02 09:52:05 24 4
gpt4 key购买 nike

我正在使用 ExecutorService 运行可运行列表。并使用 CompletableFuture 整理所有结果。我想关联 CompletableFuture 的哪个实例运行特定的可运行程序。

这是实际的代码

public static void runTasks(final List<Runnable> tasks, final int threadCount) {
final ExecutorService es = Executors.newFixedThreadPool(threadCount);
final CompletableFuture<?>[] futures = tasks.stream()
.map(task -> CompletableFuture.runAsync(task, es))
.toArray(CompletableFuture[]::new);
try {
CompletableFuture.allOf(futures).join();
es.shutdown();
} catch (Exception e) {
System.exit(1);
}
}

我将结果存储在 futures 变量中 CompletableFuture<?>[] futures

有没有办法获取结果存储在 future 实例中的 runnable 的类名?

我正在尝试打印单个任务结果,如下所示:

for (CompletableFuture future : futures) {
final boolean taskCompletedSuccessfully = future.isDone() && !(future.isCompletedExceptionally() || future.isCancelled());
LOGGER.info("Task completion status for {} : {}", <runnable class name>, (taskCompletedSuccessfully ? "SUCCESSFUL" : "FAILED"));
}

最佳答案

无法检索有关 Runnable 的任何信息,因为 CompletableFuture 不包含对其的任何引用。

因此,您必须将 future 和可运行对象(或其类名)一起存储在某些 Pair 实现中,例如:

final List<Pair<Runnable, CompletableFuture<Void>>> futures = tasks.stream()
.map(task -> new Pair<>(task, CompletableFuture.runAsync(task, es)))
.collect(toList());
try {
CompletableFuture.allOf(futures.stream().map(Pair::getB).toArray(CompletableFuture[]::new)).join();
} catch (Exception e) {
log.warn("At least one future failed", e);
}
es.shutdown();
futures.forEach(pair -> {
CompletableFuture<Void> future = pair.getB();
final boolean taskCompletedSuccessfully = !future.isCompletedExceptionally();
log.info("Task completion status for {} : {}", pair.getA().getClass().getSimpleName(), (taskCompletedSuccessfully ? "SUCCESSFUL" : "FAILED"));
});

一些注意事项:

  • 如果任何任务失败,allOf() 也会失败。在这种情况下,您可能不希望 exit() – 否则您将始终只记录成功的任务;
  • allOf().join() 之后,您可以保证 isDone() 对所有任务都成立,无需检查;
  • isCancelled()(此处不可能)意味着 isCompletedExceptionally()

关于java - 从 completablefuture 中检索 runnable 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56254818/

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