一、什么是线程池
线程池是一种池化思想的体现,经常出现在多线程程序中。使用多线程技术,主要几个优势:降低资源的开销、提高系统运行速度、对线程可管理性、提供更加强大的功能。
二、如何使用线程池
1、ThreadPoolExecutor通用构造函数参数解释
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {...}
1、corePoolSize
核心线程数,线程池的基本大小;
2、maximumPoolSize
线程池的最大线程数;
3、keepAliveTime
存活时间,线程的空闲时间超出了存活时间,该线程将会被回收;
4、unit
线程的存活时间单位;
5、workQueue
阻塞队列,用于存放执行的任务。主要有有界队列、无界队列、同步移交;
6、threadFactory
线程工厂,给线程定义名称,方便排查问题
7、handler
拒绝策略,有以下几种:
CallerRunsPolicy,有调用线程处理该任务;
AbortPolicy,丢弃任务并抛出RejectedExecutionException异常,默认策略;
DiscardPolicy,直接抛弃无异常;
DiscardOldestPolicy,抛弃下一个将会被执行的任务,然后重新提交任务;
2、ThreadPoolExecutor运行机制
运行流程如下图:
三、其他线程池的创建方式(不推荐)
通过Executors直接创建线程,例如:
1、Executors.newCachedThreadPool();
创建可缓存的线程池,线程池大小不受限制,容易引起oom。
2、Executors.newFixedThreadPool();
创建固定大小的线程池,使用的是无界队列,容易引起oom。
3、Executors.newScheduledThreadPool();
创建固定大小的线程池,以延迟或定时的方式执行。线程池大小不受限制,容易引起oom。
4、Executors.newSingleThreadExecutor();
创建一个线程的线程池,使用的是无界队列,容易引起oom。