参考:
当我们需要的并发线程数量很多时,且每个线程执行很短的时间就结束了,这样,我们频繁的创建线程、销毁线程就大大降低了工作效率(创建与销毁线程需要时间和资源)。
java的线程池可以达到这样的效果,一个线程执行完任务后,继续执行下一个任务,不被销毁,这样线程的利用率就提高了。
1、corePoolSize:核心线程数 核心线程会一直存活,即使没有任务需要执行 当线程数小于核心线程数时,即使有线程空闲,线程池也会优先创建新线程处理 设置allowCoreThreadTimeout=true(默认false)时,核心线程会超时关闭。
2、queueCapacity:任务队列容量(阻塞队列) 当核心线程数达到最大时,新任务会放在队列中排队等待执行
3、maxPoolSize:最大线程数 当线程数<=corePoolSize,且任务队列已满时。线程池会创建新线程来处理任务 当线程数=maxPoolSize,且任务队列已满时,线程池会拒绝处理任务而抛出异常
值得注意的是如果使用了无界的任务队列这个参数就没什么效果。例如new LinkedBlockingQueue<Runnable>()
BlockingQueue
workQueue 这个缓冲队列有三种类型:
直接提交SynchronousQueue
无界队列LinkedBlockingQueue
有界队列ArrayBlockingQueue
4、 keepAliveTime:线程空闲时间 当线程空闲时间达到keepAliveTime时,线程会退出,直到线程数量=corePoolSize 如果allowCoreThreadTimeout=true,则会直到线程数量=0 一般在线程数量大于核心线程数量时才会起作用,如果一个线程空闲时间达到keepAliveTime时会被终止,直到线程数不超过keepAliveTime
5、 allowCoreThreadTimeout:允许核心线程进行超时退出。当核心线程超时后也会退出
6、 rejectedExecutionHandler:任务拒绝处理句柄。
线程池按以下行为执行任务
状态 | 解释 |
---|---|
RUNNING | 运行态,可处理新任务并执行队列中的任务 |
SHUTDOW | 关闭态,不接受新任务,但处理队列中的任务 |
STOP | 停止态,不接受新任务,不处理队列中任务,且打断运行中任务 |
TIDYING | 整理态,所有任务已经结束,workerCount = 0 ,将执行terminated()方法 |
TERMINATED | 结束态,terminated() 方法已完成 |
与线程六个状态不同概念: 线程状态