当前位置: 首页 > 编程笔记 >

java中ThreadPoolExecutor常识汇总

邴姚石
2023-03-14
本文向大家介绍java中ThreadPoolExecutor常识汇总,包括了java中ThreadPoolExecutor常识汇总的使用技巧和注意事项,需要的朋友参考一下

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

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

这些参数的意义如下:

  • corePoolSize:该线程池中核心线程数最大值
  • maximumPoolSize: 该线程池中线程总数最大值
  • keepAliveTime:该线程池中非核心线程闲置超时时长
  • unit:keepAliveTime的单位
  • workQueue:阻塞队列BlockingQueue,维护着等待执行的Runnable对象
  • threadFactory:创建线程的接口,需要实现他的Thread newThread(Runnable r)方法。
  • RejectedExecutionHandler:饱和策略,最大线程和工作队列容量且已经饱和时execute方法都将调用RejectedExecutionHandler 。

ThreadPoolExecutor工作流程

流程图如下:

大致过程陈述为:

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

线程池中使用的阻塞队列

  • ArrayBlockingQueue:基于数组结构的有界阻塞队列,构造函数一定要传大小,FIFO(先进先出);
  • LinkedBlockingQueue:无界,默认大小65536(Integer.MAX_VALUE),当大量请求任务时,容易造成内存耗尽。
  • SynchronousQueue:同步队列,是一个特殊的BlockingQueue,它没有容量(这是因为在SynchronousQueue中,插入将等待另一个线程的删除操作,反之亦然)。具体可以参考:《Java SynchronousQueue Examples(译)》
  • PriorityBlockingQueue: 优先队列,无界。
  • DelayedWorkQueue:这个队列接收到任务时,首先先入队,只有达到了指定的延时时间,才会执行任务

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

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

常见四种线程池

  • newCachedThreadPool
  • newFixedThreadPool
  • newSingleThreadExecutor
  • newScheduledThreadPool

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

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

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

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊html" target="_blank">教程

 类似资料:
  • 本文向大家介绍Java中的接口知识汇总,包括了Java中的接口知识汇总的使用技巧和注意事项,需要的朋友参考一下 一.为什么要使用接口  假如有一个需求:要求实现防盗门的功能。门有"开"和"关"的功能,锁有"上锁"和"开锁"的功能。 分析:首先防盗门是一个门,门有开门和关门的功能,还有一把锁,锁有开锁和上锁,按照面向对象的编程的思想,我们会将门和锁都作为一个类而单独存在,但是,不能让防盗门继承自门的

  • 本文向大家介绍js+jquery常用知识点汇总,包括了js+jquery常用知识点汇总的使用技巧和注意事项,需要的朋友参考一下 一、jquery源码中常见的知识点   1.string,number类型转换的快捷方法   分享一个面试例子: //加会将其后面自动转换成字符串 "64"+4="644" //减会将其自动转换成数字 "64"-4=60   2.bool类型转换   !!obj,将其强制

  • 本文向大家介绍C#异常处理知识汇总,包括了C#异常处理知识汇总的使用技巧和注意事项,需要的朋友参考一下 概念   异常处理是指程序在运行过程中,发生错误会导致程序退出,这种错误,就叫做异常   但并不是所有的错误都是异常   而处理这种错误,称为异常处理   异常处理实际是不断去发掘异常、修改异常,使程序更稳定 异常处理主要表现在四个方面:     程序开发前:尽可能的想到会发生的错误,标注怎么处

  • 我有一个示例代码。 当我设置queueSize 2时,我得到了异常,因为threadpool执行器不能插入一个任务到队列中,当我设置queueSize 3时是可以的。我不明白为什么当我设置maxSize=4时,测试是可以的。它来自留档。 如果线程数小于corePoolSize,请创建一个新线程以运行新任务 如果线程数等于(或大于)corePoolSize,则将任务放入队列 如果队列已满,且线程数小

  • 本文向大家介绍Java内部类知识汇总,包括了Java内部类知识汇总的使用技巧和注意事项,需要的朋友参考一下 Java内部类 一、 含义   在Java编程语言里,程序是由类(class)构建而成的。在一个类的内部也可以声明类,我们把这样的类叫做内部类。 二、 作用 •实现了更好的封装,我们知道,普通类(非内部类)的访问修饰符不能为private或protected,而内部类可以。当我们将内部类声明

  • Java 相关知识点汇总,包括 Java 基础、Java 容器、Java 并发、JVM、编程规范、数据结构与算法、数据库、系统设计、设计模式、数据通信、网站架构、备战面试、Github 榜单。