返回

Java Executor源码解析(3)—ThreadPoolExecutor线程池execute核心方法源码

后端

在异步编程中,线程池是一个必不可少的组件,它可以有效管理线程的使用,提高程序的运行效率。ThreadPoolExecutor是Java并发包中线程池的标准实现,它提供了丰富的功能和可配置选项。

今天,我们就将对ThreadPoolExecutor线程池的execute核心方法进行详细解析,从源码层面深入理解其工作原理。

1. ExecutorService接口

在开始解析execute方法之前,我们先来了解一下ExecutorService接口。ExecutorService是Java并发包中Executor框架的核心接口,它提供了线程池管理和任务执行的常用方法。

ThreadPoolExecutor实现了ExecutorService接口,因此它可以作为ExecutorService使用。这意味着,我们可以通过ExecutorService接口来调用ThreadPoolExecutor的execute方法。

2. execute方法签名

ThreadPoolExecutor的execute方法有两个重载版本,第一个版本接受一个Runnable类型的任务参数,第二个版本接受一个Callable类型的任务参数。

以下是execute方法的详细签名:

void execute(Runnable command);
<T> Future<T> execute(Callable<T> command);

3. execute方法源码解析

现在,我们终于可以开始解析execute方法的源码了。由于两个重载版本的execute方法在逻辑上几乎相同,因此我们只解析Callable类型的execute方法。

public <T> Future<T> execute(Callable<T> command) {
    if (command == null)
        throw new NullPointerException();
    // 校验线程池是否处于终止状态
    int c = ctl.get();
    if (workerCountOf(c) < 0) // ctl.count < 0
        throw new RejectedExecutionException("ThreadPoolExecutor is shutdown");
    // 将任务添加到任务队列
    addWorker(command, true);
    // 尝试触发一个新线程的创建
    int workerCount = workerCountOf(c);
    int targetPoolSize = this.targetPoolSize;
    if (workerCount < targetPoolSize && !addWorkerCount(1))
        signalNotTerminated();
    return runStateOf(c) < 0 ? reportFuture(command) : null;
}

3.1 校验线程池是否处于终止状态

首先,execute方法会校验线程池是否处于终止状态。如果线程池处于终止状态,则会抛出RejectedExecutionException异常。

3.2 将任务添加到任务队列

接下来,execute方法将任务添加到任务队列中。任务队列是ThreadPoolExecutor内部用于存储待执行任务的队列。

3.3 尝试触发一个新线程的创建

然后,execute方法尝试触发一个新线程的创建。如果当前工作线程数小于目标线程池大小,则会创建一个新的工作线程。

3.4 返回Future对象

最后,execute方法会返回一个Future对象。Future对象可以用来获取任务的执行结果。

4. 总结

ThreadPoolExecutor的execute方法是一个非常重要的核心方法,它可以用来向线程池中提交任务。execute方法的逻辑相对简单,主要包括以下几个步骤:

  1. 校验线程池是否处于终止状态。
  2. 将任务添加到任务队列。
  3. 尝试触发一个新线程的创建。
  4. 返回Future对象。

通过对execute方法的解析,我们可以更好地理解ThreadPoolExecutor线程池的工作原理,从而在实际开发中更合理地使用线程池。