线程池

线程池的作用

控制系统中线程的数量。
减少因为线程的创建和销毁占用的系统资源

两个重要的概念

一个线程集合workerSet 用于存放线程池中的线程
一个阻塞队列workQueue 用于存放等待处理的任务

ThreadPoolExecutor参数

corePoolSize - 核心池大小
maximumPoolSize-池中允许的最大线程数。
keepAliveTime - 当线程数大于核心池大小时,多余的空闲线程等待新任务的最长时间。
unit - keepAliveTime 参数的时间单位。
workQueue - 执行前用于保持任务的队列。此队列仅保持由 execute方法提交的 Runnable任务。
threadFactory - 执行程序创建新线程时使用的工厂。
handler - 由于超出线程范围和队列容量而使执行被阻塞时所使用的处理程序。
ThreadPoolExecutor是Executors类的底层实现。

当向一个线程池中添加一个任务时的执行流程

1、判断当前线程池大小是否小于corePoolSize,如果小于corePoolSize, 就创建线程并执行该任务,否则,将该任务放入阻塞队列
2、如果能成功将任务放入阻塞队列中
如果当前线程池是非RUNNING状态,则将该任务从阻塞队列中移除,然后执行reject()
如果当前线程池处于RUNNING状态,则需要再次检查线程池(因为可能在上次检查后,有线程资源被释放),
是否有空闲的线程;如果有则执行该任务;
3、如果不能将任务放入阻塞队列中,说明阻塞队列已满;那么将尝试创建一个新的线程去执行这个任务;
如果创建新线程失败,说明线程池中线程数达到maxPoolSize,则执行reject();

Executors生成一些常用的线程池。

(1)newFixedThreadPool()
说明:初始化一个指定线程数的线程池,其中corePoolSize == maxiPoolSize,使用LinkedBlockingQuene作为阻塞队列
特点:即使当线程池没有可执行任务时,也不会释放线程。

(2)newCachedThreadPool()
说明:初始化一个可以缓存线程的线程池,默认缓存60s,线程池的线程数可达到Integer.MAX_VALUE,即2147483647,内部使用SynchronousQueue作为阻塞队列;
特点:在没有任务执行时,当线程的空闲时间超过keepAliveTime,会自动释放线程资源;当提交新任务时,如果没有空闲线程,则创建新线程执行任务,会导致一定的系统开销;
因此,使用时要注意控制并发的任务数,防止因创建大量的线程导致而降低性能。

(3)newSingleThreadExecutor()
说明:初始化只有一个线程的线程池,内部使用LinkedBlockingQueue作为阻塞队列。
特点:如果该线程异常结束,会重新创建一个新的线程继续执行任务,唯一的线程可以保证所提交任务的顺序执行

(4)newScheduledThreadPool()
特点:初始化的线程池可以在指定的时间内周期性的执行所提交的任务,在实际的业务场景中可以使用该线程池定期的同步数据。

线程池的状态(5种)

RUNNING 该状态的线程池会接收新任务,并处理阻塞队列中的任务;
SHUTDOWN 该状态的线程池不会接收新任务,但会处理阻塞队列中的任务;
STOP 该状态的线程不会接收新任务,也不会处理阻塞队列中的任务,而且会中断正在运行的任务;
TIDYING 该状态表示线程池对线程进行整理优化;
TERMINATED 该状态表示线程池停止工作;

线程池的关闭(2种)

shutdown():不会立即终止线程池,而是要等所有任务缓存队列中的任务都执行完后才终止,但再也不会接受新的任务
shutdownNow():立即终止线程池,并尝试打断正在执行的任务,并且清空任务缓存队列,返回尚未执行的任务

线程池容量可以动态调整

ThreadPoolExecutor提供了动态调整线程池容量大小的方法:setCorePoolSize()和setMaximumPoolSize()

如何合理配置线程池参数

任务的性质:CPU密集型任务,IO密集型任务和混合型任务。
任务的优先级:高,中和低。
任务的执行时间:长,中和短。
任务的依赖性:是否依赖其他系统资源,如数据库连接

线程池比较重要的几个类

Executer
Executers
ExecutorService				真正的线程池接口,集成Executer
ScheduledExecutorService	能和Timer/TimerTask类似,解决那些需要任务重复执行的问题。
ThreadPoolExecutor			ExecutorService的默认实现。
ScheduledThreadPoolExecutor	继承ThreadPoolExecutor的ScheduledExecutorService接口实现,周期性任务调度的类实现。
原文地址:https://www.cnblogs.com/jis121/p/11040995.html