首页 > 其他分享 >ThreadPoolExecutor BlockingQueue讲解

ThreadPoolExecutor BlockingQueue讲解

时间:2022-10-31 22:56:37浏览次数:41  
标签:优先级 队列 MAX 任务 线程 讲解 Integer BlockingQueue ThreadPoolExecutor

有四种常用阻塞队列策略:

1.直接拒绝:(Direct Handoffs)

一个好的工作队列应该是不缓存任务,而是直接交给线程处理,就如SynchronousQueue一样。一个任务将会入队失败,如果没有线程执行它,也就是说每次都会创建一个新线程。这样做有什么好处呢?

当有一批内部有相互依赖的任务需要要执行时,不会因为需要长时间等待其它任务而被锁住。一般都会将maximumPoolSizes设置为没有限制,避免新创建的任务被拒绝。但有一个缺点是:当新任务提交的速度比被线程消费的速度快时,会造成无限制的线程增长,导致系统load过高,甚至OOM。

 

2.无界队列(Unbounded Queue):

如果使用没有界限的队列(如LinkedBlockingQueue),则当新任务到来时,发现线程池中的线程数达到corePoolSize大小时,很不幸,他就会被加入队列,等待线程池中有线程执行完任务来读取。也就意味着,线程池中的线程数不会超过corePoolSize。当任务之间相互独立时,适合使用无界队列,例如,一个web服务器,使用无界队列可以缓和瞬间激增的请求对服务器的压力。但是当任务提交的速度比处理速度快时,会导致无界对列不断增涨。

 

3. 有界队列(Bounded Queue)

如果使用有界队列,例如: ArrayBlockingQueue, 则当新任务到来时,发现线程池中的线程数达到corePoolSize大小时,也会被加入队列,但当队列满时,会创建新的线程去执行任务,直到达到maxPoolSize。如果达到maxPoolSize,仍有任务到来,则会调用拒绝策略进行拒绝操作。当任务没有很高的及时性要求,也不想占用服务器过多CPU资源时, 可以考虑缓存一部分任务,并设置线程数的最高值。

 

4.  优先级队列(Priority Queue)

顾名思意,优先级队列,适合于具有优先级的任务。优先级队列也是一种有界队列,但与有界队列不同的时,有界队列在一开始就界定了大小,而优先级队列可以设置一个初始大小,当空间不够时,会自动扩容,直到(Integer.MAX_VALUE - 8)。例如: 转账任务,优先给VIP客户转账;

为什么最大是Integer.MAX_VALUE - 8?

我们看下JDK中的描述:

Some VMs reserve some header words in an array.
Attempts to allocate larger arrays may result in
OutOfMemoryError: Requested array size exceeds VM limit

意思是有一些JVM虚拟机会在数组中保留Header, 如果分配更大的长度,会超成OOM。这段注释只说明了为什么要减去8,因为Header信息占8个字节,那为什么是Integer.MAX_VALUE,因为数组的长度类型是非负的int类型, 这也是JVM规范规定的。比如String类型,它的底层是使用字符数组存储,所以String占用的最大内存空间是(Integer.MAX_VALUE - 8)*一个字符占的空间。看一些文章说一个字符占2个字节,其实是不准确的,因为不同的编码格式,字符对应的编码结果是不一样的,占用的内存空间当然也不一样的。比如我们常用的UTF-8编码,一个汉字可能占用2,3,4个字节,长度并不是固定的。

 

标签:优先级,队列,MAX,任务,线程,讲解,Integer,BlockingQueue,ThreadPoolExecutor
From: https://www.cnblogs.com/mycodingworld/p/9073441.html

相关文章

  • GDB全过程详细讲解
    摘自:https://blog.csdn.net/guo_lei_lamant/article/details/83787730 4.堆栈查看调用堆栈(callstack)无疑是调试过程中非常重要的事情。(gdb)where#查看调用堆栈......
  • java如何引用外部类(文末有视频讲解)
    导航​​步骤1全限定名​​​​步骤2编译,报错,欧耶~​​​​步骤3访问权限修饰符​​​​步骤4编译和运行Demo.java​​​​步骤5导入包​​​​步骤6导入静态方......
  • java访问权限讲解(文末有视频教程)
    导航​​步骤1图解​​​​步骤2public对于class是最常用的​​​​步骤3protected多用于继承的情况​​​​步骤4private一般就是用于属性​​​​步骤5企业中的......
  • java项目结构分类实战(文末有视频讲解)
    导航​​步骤1分包​​​​步骤2Application​​​​步骤3Customer​​​​步骤4Vip​​​​步骤5目录结构​​​​步骤6下载源码​​​​步骤7视频教程​​......
  • Java基础 -- 我是这么理解static关键字的(文末配讲解视频)
    static是java里面的关键字,主要用来修饰属性和方法。打上static标记后,就是静态的,不需要new就可以访问。导航​​假如一个方法没有用到this?​​​​static的意义​​​​stati......
  • Java多线程Thread详细讲解(万字教程)
    一、线程的基本概念线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它......
  • cximage功能讲解1
    CxImage的功能Constructors  构造函数Initialization  初始化File 文件操作,主要是编解码Generic 图像基本变化DSP 图像处理操作Painting 绘图操作Multiple......
  • C语言之入门讲解
    目录1C语言基础讲解1.1C语言历史1.2C语言特点1.3C语言程序结构1.3.1简单示例1.3.2编译&执行C程序2数据类型2.1概述2.2标识符2.3数据类型2.3.1整数类型2.3.2......
  • 【JEECG】Vue3-01项目核心讲解
    .editorconfig.env.env.development.env.production.env.test.eslintignore.eslintrc.js.gitignore.gitpod.yml.prettierignore.stylelintignore.yarncleancomm......
  • 肖sir____linux___ 讲解(1)
    1、rm -rf *  删除目录下所有的文件和目录2、useradd  用户名案例:useradd  bl   在home目录下有用户   3、cat /etc/passwd 查看新建用户......