概述:
在Java中,可以利用Executor来创建线程池,线程池可以帮助我们更好的去管理线程,避免频繁开启关闭线程所带来的性能损耗
ExecutorService threadPool = Executor.newCachedThreadPool();
Java中提供的线程池
1 newCachedThreadPool
带有缓存功能的线程池,适用于处理大量短时间工作的线程,它会缓存线程并重用,当无缓存线程的时候,就会新键工作线程,如果线程闲置超过60s,则被终止并移除缓存,即使在长时间闲置,这种线程池也不会消耗什么资源。
2 newFixedThreadPool
固定大小的线程池,在任何时候最多有n个工作线程是活动的,有工作线程退出时,将会有新的工作线程被创建。
3 newSingleThreadExecutor
工作线程的数目被限制为1,所有的任务按顺序执行,最多只会有一个线程处于工作状态
4 newScheduleThreadPool
可以进行周期性的工作调度
5 newWorkStealingPool
基于work-stealing算法,并行处理任务,会根据当前处理器的参数,确定开启的线程数量,但是不保证按顺序返回
线程池参数
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
corePoolSize: 核心线程数,内存中存在多少线程。
maximumPoolSize:最大线程数,在内存中最多存在多少线程
keepAliveTime:空闲线程的存活时间
TimeUnit:时间单位
BlockingQueue: 线程池使用的缓冲队列,存放等待执行的线程
注:常用的BlockingQueue:
ArrayBlockingQueue:
是一个由数组实现的有界阻塞队列,必须设定容量
LinkedBlockingQueue:
是一个由链表实现的有界队列,容量可以选择设置,如果不设置的话,将是一个无边界阻塞队列,最大长度为 Integer.MAX_VALUE
PriorityBlockingQueue:
具有优先级的阻塞队列
threadFactoy:创建线程池使用的工厂,通过工厂,我们可以给每个新建的线程,提供一个具有识别度的线程名,便于问题的排查
handler 线程池的饱和策略,当线程池满了,如果想要继续提交任务,必须采取一种策略处理该任务,线程池提供了4种策略
1 默认策略,直接抛出异常
2 用调用者的线程来执行该任务
3 移除线程池阻塞队列中最靠前的任务,执行当前任务
4 直接丢弃任务。