java CompletableFuture的runAsync

76 阅读1分钟

背景

很多时候需要一些简单的异步操作,如果都是new Thread(),然后start的话会有很多线程

CompletableFuture.runAsync这个静态方法可以更加方便,而且使用线程池可以更加灵活

代码分析

runAsync 方法有两个重载的方法:

  • 其中一个只有一个参数Runnable runnable
  • 另外一个是有两个参数,多了一个可以手动配置线程池,而不是默认的线程池
public static CompletableFuture<Void> runAsync(Runnable runnable) {
    return asyncRunStage(asyncPool, runnable);
}
public static CompletableFuture<Void> runAsync(Runnable runnable,
                                               Executor executor) {
    return asyncRunStage(screenExecutor(executor), runnable);
}

然后我们看静态内部类:

static final class AsyncRun extends ForkJoinTask<Void>
        implements Runnable, AsynchronousCompletionTask {
    CompletableFuture<Void> dep; Runnable fn;
    AsyncRun(CompletableFuture<Void> dep, Runnable fn) {
        this.dep = dep; this.fn = fn;
    }

    public final Void getRawResult() { return null; }
    public final void setRawResult(Void v) {}
    public final boolean exec() { run(); return true; }

    public void run() {
        CompletableFuture<Void> d; Runnable f;
        if ((d = dep) != null && (f = fn) != null) {
            dep = null; fn = null;
            if (d.result == null) {
                try {
                    f.run();
                    d.completeNull();
                } catch (Throwable ex) {
                    d.completeThrowable(ex);
                }
            }
            d.postComplete();
        }
    }
}

相关阅读