up:: 线程池ThreadPoolExecutor提供的钩子方法

说明:

(1) 前面几篇博客,演示了线程池的一些内容;其中用到了很多线程池相关的类;本篇博客,就简单介绍一下这些线程池相关的类;

(2) 线程池相关的类主要有两方面的:

● 线程池类(接口):ThreadPoolExecutor,AbstractExecutorService,ExecutorService,Executor;

● 创建线程池的工具类:Executors;


一:线程池的组成部分;

(1)线程池管理器(ThreadPool)

线程池管理器主要作用是管理线程池,比如创建线程池、停止线程池等;

(2)工作线程(PoolWorker)

工作线程,就是线程池中创建出来的、用于执行任务的线程;这些线程会反复的去队列中取任务,取来任务后就去执行;

(3)任务队列(taskQueue)

任务队列是用来存放任务的队列;由于,会存在【同时多个线程从队列中取任务】,所以这个队列需要支持并发;

(4)任务接口(Task);

这个指的就是要通过线程去执行的任务;


二:线程池相关的类:ThreadPoolExecutor,ExecutorService,Executor;Executors;

1.使用案例;

在【线程池Executors工具类提供的4种自动创建线程池的策略】中,我们演示了线程池的一些用法;其中,主要脉络如下:

2. 线程池类:ThreadPoolExecutor,AbstractExecutorService,ExecutorService,Executor;


(1)Executor接口:顶层接口;


(2)ExecutorService接口:继承了Executor接口;


(3)AbstractExecutorService类:实现了ExecutorService接口;


(4)ThreadPoolExecutor类:继承了AbstractExecutorService类;

3.Executors类:帮助我们快速创建线程池的,工具类;

4.【1.使用案例;】的解释;


三:线程池,部分源码分析;

1. 线程池,实现【任务复用】的原理;

(1)线程池中,线程任务复用:简述;

线程池实现线程复用的核心是,让相同的线程去执行不同的任务;即,一个线程拿到一个任务,然后去执行任务;当这个线程把任务执行完毕后,这个线程会继续从队列中拿下一个任务去执行;

线程池对线程做了包装,我们不需要重复启动线程;即,一个线程被创建后,该线程拿到第一个任务时,线程池会启动这个线程,以让该线程去执行任务;但是,当该线程拿到第二个任务的时候,我们就不需要再次去启动这个线程了;即,该线程会自动检测有没有新任务过来,如果有新任务过来,这个线程会自动去执行新的任务;

(2)源码;

我们去看下ThreadPoolExecutor线程池类中,execute()方法的具体实现:

那么,为了看一下线程实现任务复用的原因,我们去看下runWorker()方法:

2.线程池execute()方法:接收任务、执行线程;

(1)execute()方法,简述;

(2)源码;

声明: execute()方法,最初是定义在Executor这个线程池最顶层接口中的;然后ThreadPoolExecutor类提供了该方法的实现;