传递给 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);
}
}