从completablefuture检索runnable的实例

时间:2019-05-22 10:32:17

标签: java completable-future

我正在使用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);
    }
}

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

是否可以获取可运行类的名称,其结果存储在future的实例中?

我正在尝试按以下方式打印单个任务结果:

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

1 个答案:

答案 0 :(得分:1)

由于{{:name Jon :rank 1} {:name Matthew :rank 2} {:name Mary :rank 3}}没有任何引用,因此无法检索有关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()