java中ThreadPoolExecutor常识汇总

发布时间:2020-09-18 00:17:24 作者:有爱jj
来源:脚本之家 阅读:156

线程池技术在并发时经常会使用到,java中的线程池的使用是通过调用ThreadPoolExecutor来实现的。ThreadPoolExecutor提供了四个构造函数,最后都会归结于下面这个构造方法:

// 七个参数的构造函数
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)

这些参数的意义如下:

ThreadPoolExecutor工作流程

流程图如下:

java中ThreadPoolExecutor常识汇总

大致过程陈述为:

  1. 向线程池中添加任务,当任务数量少于corePoolSize时,会自动创建thead来处理这些任务;
  2. 当添加任务数大于corePoolSize且少于maximmPoolSize时,不在创建线程,而是将这些任务放到阻塞队列中,等待被执行;
  3. 接上面2的条件,且当阻塞队列满了之后,继续创建thread,从而加速处理阻塞队列;
  4. 当添加任务大于maximmPoolSize时,根据饱和策略决定是否容许继续向线程池中添加任务,默认的饱和策略是AbortPolicy(直接丢弃)。

线程池中使用的阻塞队列

阻塞队列常见的方法如下表所示:

方法名 说明 注意
add 增加一个元索 如果队列已满,则抛出一个IIIegaISlabEepeplian异常
remove 移除并返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
element 返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
offer 添加一个元素并返回true 如果队列已满,则返回false
poll 移除并返问队列头部的元素 如果队列为空,则返回null
peek 返回队列头部的元素 如果队列为空,则返回null
put 添加一个元素 如果队列满,则阻塞
take 移除并返回队列头部的元素 如果队列为空,则阻塞

常见四种线程池

线程池 使用的阻塞队列 线程池大小 超时
CachedThreadPool SynchronousQueue(队列长度无限 可增加,最大值Integer.MAX_VALUE 默认60秒超时
FixedThreadPool LinkedBlockingQueue(队列长度无限) 可指定nThreads,固定数量 不会超时
newSingleThreadExecutor LinkedBlockingQueue(队列长度无限), 固定为1 不超时
newScheduledThreadPool DelayedWorkQueue 可增加,最大值Integer.MAX_VALUE 不超时

它们通过Executors以静态方法的方式直接调用,实质上是它们最终调用的是ThreadPoolExecutor的构造方法,也就是本文最前面那段代码。

注:KeepAliveTime=0的话,表示不等待

《阿里巴巴java开发手册》中建议线程池不使用 Executors 去创建,而是通过 ThreadPoolExecutor的方式,这样的处理方式让写的人员更加明确线程池的运行规则,规避资源耗尽的风险。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持亿速云。

推荐阅读:
  1. 关于过程和线程的常识点汇总
  2. 输出/输入(I/O)常识点汇总

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java threadpoolexecutor 常识

上一篇:Django发送邮件和itsdangerous模块的配合使用解析

下一篇:Python基于内置库pytesseract实现图片验证码识别功能

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》