java四种线程池类型以及可选择的阻塞队列
之前笔记有记录java线程池的拒绝策略,回顾⼀下线程池的处理任务的优先级:
先考虑corePoolSize、任务队列(缓冲队列)workQueue、最⼤线程maximumPoolSize,如果三者都满了,使⽤handler处理被拒绝的任务。
即:
如果运⾏的线程少于corePoolSize,则 Executor 始终⾸选添加新的线程,⽽不进⾏排队。(如果当前运⾏的线程⼩于corePoolSize,则任务根本不会存⼊queue中,⽽是直接运⾏)
如果运⾏的线程⼤于等于 corePoolSize,则 Executor始终⾸选将请求加⼊队列,⽽不添加新的线程。
如果⽆法将请求加⼊队列,则创建新的线程,除⾮创建此线程超出 maximumPoolSize,在这种情况下,任务将被拒绝。
BlockingQueue <Runnable> workQueue 这个缓冲队列有三种类型:
1、直接提交SynchronousQueue
2、⽆界队列LinkedBlockingQueue
3、有界队列ArrayBlockingQueue
四种常⽤线程池:
1、newCachedThreadPool:内部使⽤SynchronousQueue
java线程池创建的四种
2、newFixedThreadPool:内部使⽤
3、newScheduledThreadPool:内部使⽤DelayedWorkQueue
4、newSingleThreadExecutor
(⼀般不要直接⽤包装好的,根据具体问题⾃⾏使⽤参数创建)
***问题:如果没达到核⼼线程的时候如果再有请求的时候为什么还会创建新线程?就算有空闲线程?
vimi说:“代码逻辑”
if(没满){
新建
}
else{
if(还有空闲){
这时候才插⼊到空闲
}
else{
再去考虑加⼊队列以及拒绝策略
}
}
参考:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。