Java Executor源码解析(3)—ThreadPoolExecutor线程池execute核心方法源码
2024-01-06 22:41:27
在异步编程中,线程池是一个必不可少的组件,它可以有效管理线程的使用,提高程序的运行效率。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方法的逻辑相对简单,主要包括以下几个步骤:
- 校验线程池是否处于终止状态。
- 将任务添加到任务队列。
- 尝试触发一个新线程的创建。
- 返回Future对象。
通过对execute方法的解析,我们可以更好地理解ThreadPoolExecutor线程池的工作原理,从而在实际开发中更合理地使用线程池。