Java线程池笔记
总结
- 线程池核心为
java.uitl.concurrent.ThreadPoolExecutor
类,该类有几个构造函数,实际上调用的是一个,其参数的大致含义:- corePoolSize:核心池的大小
- maximumPoolSize:线程池最大线程数
- keepAliveTime:表示线程没有任务执行时最多保持多久时间会终止。
- unit:参数keepAliveTime的时间单位
- workQueue:一个阻塞队列,用来存储等待执行的任务
- threadFactory:线程工厂,主要用来创建线程;
- handler:表示当拒绝处理任务时的策略,有以下四种取值:
ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。 ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。 ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务
- 一般来说,提交一个任务,
- 当前线程数小于
corePoolSize
,则新建线程来执行; - 大于
corePoolSize
,则放入队列workQueue
; - 队列满了以后,如果线程数小于
maximumPoolSize
,则新建线程来执行; - 大于
maximumPoolSize
,则根据拒绝处理任务时的策略处理。
- 当前线程数小于
- 一般来说,当一个任务被线程执行完毕,
- 当前若不为空闲,继续执行其他任务;
- 若空闲
keepAliveTime
单位时间后,线程数大于corePoolSize
,释放该线程; - 线程数小于
corePoolSize
,无特殊设置不处理;
Executors
类中提供的几个静态方法来创建线程池,实际上也是调用了ThreadPoolExecutor
FixedThreadPool
创建的线程池corePoolSize和maximumPoolSize值是相等的,它使用的LinkedBlockingQueue;SingleThreadExecutor
将corePoolSize和maximumPoolSize都设置为1,也使用的LinkedBlockingQueue;CachedThreadPool
将corePoolSize设置为0,将maximumPoolSize设置为Integer.MAX_VALUE,使用的SynchronousQueue,也就是说来了任务就创建线程运行,当线程空闲超过60秒,就销毁线程。