监视、调试和跟踪 CompletableFuture 任务。

问题描述 投票:0回答:1

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

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

Javadoc for CompletableFuture.AsynchronousCompletionTask(异步完成任务) 似乎很有前途,但不清楚如何使用它。

一个识别异步方法产生的异步任务的标记接口。这可能对监控、调试和跟踪异步活动很有用。

java concurrency completable-future
1个回答
0
投票

传递给执行者的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);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.