【JUC源码】线程池:ThreadPoolExecutor(一)继承关系分析

线程池系列:

在看 ThreadPoolExecutor 的源码前,我们先来看一下 ThreadPoolExecutor 的继承关系

在这里插入图片描述

1.Executor

定义 execute 方法来执行任务,入参是 Runnable,无出参

public interface Executor {
    
    
    void execute(Runnable command);
}

2.ExecutorService

Executor 的功能太弱,ExecutorService 丰富了对任务的执行和管理的功能,主要代码如下:

public interface ExecutorService extends Executor {
    
    
    // 提交有返回值的任务,使用 get 方法可以阻塞等待任务的执行结果返回
    <T> Future<T> submit(Callable<T> task);
    // 提交没有返回值的任务,如果使用 get 方法的话,任务执行完之后得到的是 null 值
    Future<?> submit(Runnable task);
    
    // 给定任务集合,返回已经执行完成的 Future 集合,每个返回的 Future 都是 isDone = true 的状态
    <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
        throws InterruptedException;
    // 给定任务中有一个执行成功就返回,如果抛异常,其余未完成的任务将被取消
    <T> T invokeAny(Collection<? extends Callable<T>> tasks)
        throws InterruptedException, ExecutionException;
    
    // 关闭,不会接受新的任务,也不会等待未完成的任务
    // 如果需要等待未完成的任务,可以使用 awaitTermination 方法
    void shutdown();
    // 在超时时间内,等待剩余的任务终止
    boolean awaitTermination(long timeout, TimeUnit unit)
        throws InterruptedException;
    
    // executor 是否已经关闭了,返回值 true 表示已关闭
    boolean isShutdown();
    // 所有的任务是否都已经终止,是的话,返回 true
    boolean isTerminated();
    
}

3.AbstractExecutorService

  • 抽象类,封装了 Executor 的很多通用功能
  • 实现了部分 ExecutorService 方法
public abstract class AbstractExecutorService implements ExecutorService {
    
    
   
    // 将Callabbe,想要返回值的Runnable转化成Callable
    protected <T> RunnableFuture<T> newTaskFor(Runnable runnable, T value) {
    
    
        return new FutureTask<T>(runnable, value);
    }
    // FutureTask(Runnable,T) -> RunnableFuture -> Runnable
    protected <T> RunnableFuture<T> newTaskFor(Callable<T> callable) {
    
    
        return new FutureTask<T>(callable);
    }
    
    // submit调用的还是execute
    // 只不过将Callable,要返回值的Runnable提前转化成了RunnableFuture
    // 提交无返回值的任务
    public Future<?> submit(Runnable task) {
    
    
        if (task == null) throw new NullPointerException();
        // ftask 其实是 FutureTask
        RunnableFuture<Void> ftask = newTaskFor(task, null);
        execute(ftask);
        return ftask;
    }
    
    // 提交有返回值的任务
    public <T> Future<T> submit(Callable<T> task) {
    
    
        if (task == null) throw new NullPointerException();
        // ftask 其实是 FutureTask
        RunnableFuture<T> ftask = newTaskFor(task);
        execute(ftask);
        return ftask;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43935927/article/details/113966340