我想在使用CompletableFuture时监控、跟踪和调试我的任务,例如在下面的代码中。
CompletableFuture.supplyAsync(() -> 2)
.thenApply(i -> i*2)
.thenAccept(i -> System.out.println("i = " + i));
Javadoc for CompletableFuture.AsynchronousCompletionTask(异步完成任务) 似乎很有前途,但不清楚如何使用它。
一个识别异步方法产生的异步任务的标记接口。这可能对监控、调试和跟踪异步活动很有用。
传递给执行者的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);
}
}