JDK线程池概要
-
1、Executors,线程池执行器
-
生成线程池的具体调用类
-
newFixedThreadPool
- 创建一个定长的线程池,使用LinkedBlockingQueue作为任务队列
-
newSingleThreadExecutor
- 创建一个单线程的线程池
-
newCachedThreadPool
创建一个*线程池(最大线程池容量为最大int值),每一个任务都会新增一个线程,使用SynchronousQueue作为任务队列
若有线程60秒闲置,则会回收该线程
-
newScheduledThreadPool
- 创建一个*线程池,使用DelayedWorkQueue作为任务队列,支持定时周期执行任务
-
-
-
ExecutorService
- 统一的线程池执行器接口
-
ThreadPoolExecutor
ExecutorService的实现
-
核心参数:
-
corePoolSize
- 核心线程数,在线程数少于该值时,若有任务提交,则会创建线程
-
maximumPoolSize
线程池最大线程数
当线程数达到corePoolSize,新来的任务会放入任务队列,当任务队列满了,则会新建线程,直到线程数达到maximumPoolSize
-
workQueue
- 线程池任务队列,存放待执行任务
-
keepAliveTime
- 当超过corePoolSize数目的线程空闲时间达到keepAliveTime,线程会退出
- 只有超过corePoolSize的线程会退出
-
threadFactory
- 线程工厂类
-
handler
当线程池中的线程数大于maximumPoolSize,对拒绝任务的处理策略
-
默认值ThreadPoolExecutor.AbortPolicy(),直接抛出拒绝执行异常
a) CallerRunsPolicy:如果发现线程池还在运行,就直接运行这个线程
b) DiscardOldestPolicy:如果线程池还在运行,抛弃任务队列里第一个任务(最早的任务),然后执行当前任务
c) DiscardPolicy:什么也不做
d) AbortPolicy:java默认,抛出一个异常:RejectedExecutionException
-
-
ThreadFactory
- 创建线程的工厂,非线程池
-
ScheduledThreadPoolExecutor
- 周期性调度线程池执行器
2、阻塞队列
-
线程池的任务队列通过阻塞队列实现,常用的阻塞队列:LinkedBlockingQueue、SynchronousQueue等
-
add(E e)
- 放进队列,调用offer,如果成功,返回true,否则抛异常,立即返回
-
offer(E e)
- 放进队列,如果队列满了,返回失败,立即返回
-
put(E e)
- 放进队列,如果队列满了,此方法会阻塞住,直到队列不满
-
offer(E e, long timeout, TimeUnit unit)
- 放进队列,如果队列满了,会阻塞timeout的时间
-
take()
- 取值,如果队列为空,阻塞直到队列有值
-
poll(long timeout, TimeUnit unit)
- 取值,如果队列为空,阻塞timeout时间
-
-
LinkedBlockingQueue
链表实现的阻塞队列,按先进先出排序
若未指定容量,默认Integer.MAX_VALUE
-
SynchronousQueue
基于生产消费者模式的特殊队列,无容器,相当于只能存放一个值
出队、入队操作,需配对出现,否则会阻塞
-
DelayedWorkQueue
- 周期性调度执行器里内置的延迟队列