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

2、newFixedThreadPool:内部使用

3、newScheduledThreadPool:内部使用DelayedWorkQueue

4、newSingleThreadExecutor

(一般不要直接用包装好的,根据具体问题自行使用参数创建)

***问题:如果没达到核心线程的时候如果再有请求的时候为什么还会创建新线程?就算有空闲线程?

vimi说:“代码逻辑”

1if(没满){ 2 新建 3} 4else{ 5 if(还有空闲){ 6 这时候才插入到空闲 7 } 8 else{ 9 再去考虑加入队列以及拒绝策略 10 } 11}

参考:https://zhuanlan.zhihu.com/p/32867181

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java 面试知识点笔记(十三)多线程与并发

java线程池,利用Exceutors创建不同的线程池满足不同场景需求:1.newSingleThreadExecutor() 创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。2.

Java多线程之线程池7大参数、底层工作原理、拒绝策略详解

Java多线程之线程池7大参数详解目录企业面试题线程池7大参数源码线程池7大参数详解底层工作原理详解线程池的4种拒绝策略理论简介面试的坑:线程池实际中使用哪一个?1\.企业面试题线程池的工作原理,几个重要参数,然后给了具体几个参数分析线程池会怎么做,最后问阻塞队列用是什么?线程池的构造类的方

Java通过Executors提供四种线程池

Java通过Executors提供四种线程池,分别为:newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。newFixedThreadPool创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。newScheduledThreadPool创建