0

我想在使用 CompletableFuture 时监控、跟踪和调试我的任务,例如在以下代码中:

CompletableFuture.supplyAsync(() -> 2)
    .thenApply(i -> i*2)
    .thenAccept(i -> System.out.println("i = " + i));

CompletableFuture.AsynchronousCompletionTask的 Javadoc看起来很有希望,但不清楚如何使用它:

标识由 async 方法生成的异步任务的标记接口。这对于监视、调试和跟踪异步活动可能很有用。

4

1 回答 1

0

传递给 executor 的 Runnables 不会是原始的 Runnables,它们将被包装到一个实现 AsynchronousCompletionTask 的类中,这使得跟踪成为可能,如下代码所示:

public class Main {
    private static final Executor tracker = new TrackingExecutor(ForkJoinPool.commonPool());

    public static void main(String[] args) throws InterruptedException {
        CompletableFuture.supplyAsync(() -> 2, tracker)
            .thenApply(i -> i*2)
            .thenAccept(i -> System.out.println("i = " + i));
        Thread.sleep(1000);
    }
}

class TrackingExecutor implements Executor {
    private Executor delegate;

    public TrackingExecutor(Executor delegate) {
        this.delegate = delegate;
    }

    @Override
    public void execute(Runnable task) {
        if(task instanceof CompletableFuture.AsynchronousCompletionTask) {
            System.out.println("executing CompletableFuture task");
        }
        delegate.execute(task);
    }
}
于 2020-05-12T18:21:20.883 回答