美文网首页JUC并发包
ThreadPoolExecutor源码历险-主流程常用方法-s

ThreadPoolExecutor源码历险-主流程常用方法-s

作者: 于情于你 | 来源:发表于2021-01-15 13:48 被阅读0次

    今天我们来说一下另一个用的频率比较高的提交任务的方法submit,ThreadPoolExecutor的submit是继承AbstractExecutorService获得的。


image.png

submit有三个重载方法:


image.png

    第一个重载方法,参数Runnable,不指定泛型类型,返回的也是通配符泛型类型。
    第二个重载方法,参数Runnable,指定泛型类型
    第三个重载方法,参数Callable,指定泛型类型

public Future<?> submit(Runnable task) {
        if (task == null) throw new NullPointerException();
        RunnableFuture<Void> ftask = newTaskFor(task, null);
        execute(ftask);
        return ftask;
    }

 public <T> Future<T> submit(Runnable task, T result) {
        if (task == null) throw new NullPointerException();
        RunnableFuture<T> ftask = newTaskFor(task, result);
        execute(ftask);
        return ftask;
    }

public <T> Future<T> submit(Callable<T> task) {
        if (task == null) throw new NullPointerException();
        RunnableFuture<T> ftask = newTaskFor(task);
        execute(ftask);
        return ftask;
    }

    可以看到三个方法都通过newTaskFor方法得到了一个RunnableFuture对象,然后调用execute方法执行RunnableFuture的任务,并且返回了RunnableFuture。
    这个RunnableFuture继承了Runnable和Future,既是一个可以执行的任务,又是一个异步计算的结果。

public interface RunnableFuture<V> extends Runnable, Future<V> {
    /**
     * Sets this Future to the result of its computation
     * unless it has been cancelled.
     */
    void run();
}

newTaskFor的源码也比较简单:

protected <T> RunnableFuture<T> newTaskFor(Runnable runnable, T value) {
        return new FutureTask<T>(runnable, value);
    }

protected <T> RunnableFuture<T> newTaskFor(Callable<T> callable) {
        return new FutureTask<T>(callable);
    }

    FutureTask表示可以取消的异步计算任务。它可以获取任务执行结果、取消任务执行、查看任务是否已经执行完成等等。并且实现了RunnableFuture,所以newTaskFor方法可以直接返回它。

public class FutureTask<V> implements RunnableFuture<V> {
}

下面一张UML图表示了上面角色之间的关系


image.png

相关文章

网友评论

    本文标题:ThreadPoolExecutor源码历险-主流程常用方法-s

    本文链接:https://www.haomeiwen.com/subject/outwaktx.html