一、线程池基本原理分析
1、什么是线程池
线程池就是一种池化技术,核心思想就是事先创建多个线程,将线程资源放到池子中,这样任务到达时可以 不需要等到线程创建就能立刻去执行。
创建线程池的好处:
- 降低资源消耗。线程池可避免大量线程的创建于销毁造成的消耗。
- 提高响应速度。任务到达时,线程池中线程可立即去执行,无需等待线程的创建。
- 提高线程的可管理性。利用线程池可以进行统一分配、调优和监控。
2、线程池原理
当向线程池提交一个任务的时候,工作原理如下:
(1)首先判断核心线程池中(corePool)线程是否都在执行任务。如果不是,则在核心线程池中创建一个线程来执行任务。如果核心线程池的线程都在执行任务,则进入第2步;
(2)判断工作队列(BlockingQueue)是否已经满。如果工作队列没有满,则将新提交的任务存储在工作队列中(此时核心线程池中的某个线程执行完任务后,就会执行工作队列中存储的任务)。如果工作队列已经满了,则进入第3步;
(3)判断线程池(maximumPool)所有线程是否都处在工作状态,如果不是,则创建一个线程来执行任务(注:非核心线程池中的线程);如果是,则交给饱和策略来处理这个任务。
线程池工作原理示意图如下图所示:
3、线程池ThreadPoolExecutor源码分析
线程池的核心实现类是ThreadPoolExecutor,所以首先看看ThreadPoolExecutor中最重要的方法:execute()。
注:下面源码来自JDK 1.8.
public void execute(Runnable command) {
if (command == null)
throw new NullPointerException();
int c = ctl.get();
// 1、如果当前线程数小于核心线程数,就在核心线程池中创建线程执行任务
if (workerCountOf(c) < corePoolSize) {
//true-代表在corePool中创建线程,添加成功返回
if (addWorker(command,