Java之ThreadPoolExecutor类详解

 更新时间:2021年08月02日 08:49:27   作者:一只可爱的小狐狸  
这篇文章主要介绍了Java之ThreadPoolExecutor类详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

ThreadPoolExecutor

ThreadPoolExecutor是线程池框架的一个核心类,线程池通过线程复用机制,并对线程进行统一管理

  • 降低系统资源消耗。通过复用已存在的线程,降低线程创建和销毁造成的消耗;
  • 提高响应速度。当有任务到达时,无需等待新线程的创建便能立即执行;
  • 提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗大量系统资源,还会降低系统的稳 定性,使用线程池可以进行对线程进行统一的分配、调优和监控。

线程池的运行状态总共有5种,其值和含义分别如下:

  • RUNNING: 高3位为111,接受新任务并处理阻塞队列中的任务
  • SHUTDOWN: 高3位为000,不接受新任务但会处理阻塞队列中的任务
  • STOP:高3位为001,不会接受新任务,也不会处理阻塞队列中的任务,并且中断正在运行的任务
  • TIDYING: 高3位为010,所有任务都已终止,工作线程数量为0,线程池将转化到TIDYING状态,即将要执行 terminated()结束钩子方法
  • TERMINATED: 高3位为011,terminated()方法已经执行结束

构造器中各个参数的含义:

1.corePoolSize
线程池中的核心线程数。当提交一个任务时,线程池创建一个新线程执行任务,直到当前线程数等于 corePoolSize;如果当前线程数为corePoolSize,继续提交的任务被保存到阻塞队列中,等待被执行。

2.maximumPoolSize
线程池中允许的大线程数。如果当前阻塞队列满了,且继续提交任务,则创建新的线程执行任务,前提是当前线 程数小于maximumPoolSize。

3.keepAliveTime

线程空闲时的存活时间。默认情况下,只有当线程池中的线程数大于corePoolSize时,keepAliveTime才会起作 用,如果一个线程空闲的时间达到keepAliveTime,则会终止,直到线程池中的线程数不超过corePoolSize。但是 如果调用了allowCoreThreadTimeOut(boolean)方法,keepAliveTime参数也会起作用,直到线程池中的线程数为 0。

4.unit
keepAliveTime参数的时间单位。

5.workQueue
任务缓存队列,用来存放等待执行的任务。如果当前线程数为corePoolSize,继续提交的任务就会被保存到任务缓 存队列中,等待被执行。
一般来说,这里的BlockingQueue有以下三种选择:
SynchronousQueue:一个不存储元素的阻塞队列,每个插入操作必须等到另一个线程调用移除操作,否则 插入操作一直处于阻塞状态。因此,如果线程池中始终没有空闲线程(任务提交的平均速度快于被处理的速 度),可能出现无限制的线程增长。 LinkedBlockingQueue:基于链表结构的阻塞队列,如果不设置初始化容量,其容量Integer.MAX_VALUE, 即为无界队列。因此,如果线程池中线程数达到了corePoolSize,且始终没有空闲线程(任务提交的平均速度 快于被处理的速度),任务缓存队列可能出现无限制的增长。 ArrayBlockingQueue:基于数组结构的有界阻塞队列,按FIFO排序任务。

6.threadFactory
线程工厂,创建新线程时使用的线程工厂。

7.handler
任务拒绝策略,当阻塞队列满了,且线程池中的线程数达到maximumPoolSize,如果继续提交任务,就会采取任 务拒绝策略处理该任务,线程池提供了4种任务拒绝策略:

  • AbortPolicy:丢弃任务并抛出RejectedExecutionException异常,默认策略;
  • CallerRunsPolicy:由调用execute方法的线程执行该任务;
  • DiscardPolicy:丢弃任务,但是不抛出异常;
  • DiscardOldestPolicy:丢弃阻塞队列前面的任务,然后重新尝试执行任务(重复此过程)。
  • 当然也可以根据应用场景实现RejectedExecutionHandler接口自定义饱和策略,如记录日志或持久化存储不能处 理的任务。

到此这篇关于Java之ThreadPoolExecutor类详解的文章就介绍到这了,更多相关Java之ThreadPoolExecutor内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot自定义错误处理逻辑详解

    SpringBoot自定义错误处理逻辑详解

    这篇文章主要介绍了SpringBoot自定义错误处理逻辑,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-10-10
  • java中@NotBlank限制属性不能为空

    java中@NotBlank限制属性不能为空

    在实体类的对应属性上添 @NotBlank注解,可以实现对空置的限制,本文就来介绍一下java中@NotBlank限制属性不能为空,感兴趣的可以了解一下
    2024-01-01
  • springboot中的controller注意事项说明

    springboot中的controller注意事项说明

    这篇文章主要介绍了springboot中的controller注意事项说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • struts2.3.24+spring4.1.6+hibernate4.3.11+mysql5.5.25开发环境搭建图文教程

    struts2.3.24+spring4.1.6+hibernate4.3.11+mysql5.5.25开发环境搭建图文

    这篇文章主要介绍了struts2.3.24+spring4.1.6+hibernate4.3.11+mysql5.5.25开发环境搭建图文教程,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • Java的常见热门ORM框架优缺点区别

    Java的常见热门ORM框架优缺点区别

    Java ORM框架是一种用于将Java对象映射到关系型数据库中的工具,使得开发人员能够通过对象操作数据库而不必直接使用SQL查询,Java开发变得更加高效和易于维护,选择适合你的ORM框架是根据你的需求决定的,比如你的应用场景,数据结构和技术水平等
    2024-02-02
  • spring整合redis消息监听通知使用的实现示例

    spring整合redis消息监听通知使用的实现示例

    在电商系统中,秒杀,抢购,红包优惠卷等操作,一般都会设置时间限制,本文主要介绍了spring整合redis消息监听通知使用,具有一定的参考价值,感兴趣的可以了解一下
    2021-12-12
  • Hadoop+HBase+ZooKeeper分布式集群环境搭建步骤

    Hadoop+HBase+ZooKeeper分布式集群环境搭建步骤

    这篇文章主要介绍了Hadoop+HBase+ZooKeeper分布式集群环境搭建,集群环境至少需要3个节点,1个Master,2个Slave,节点之间局域网连接,可以相互ping通,本文通过实例给大家介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • 基于Java注解(Annotation)的自定义注解入门介绍

    基于Java注解(Annotation)的自定义注解入门介绍

    要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为我们提供的元注解和相关定义注解的语法
    2013-04-04
  • java二维数组实现推箱子小游戏

    java二维数组实现推箱子小游戏

    这篇文章主要为大家详细介绍了java二维数组实现推箱子小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • SpringBoot时区问题解决以及彻底解决时差问题

    SpringBoot时区问题解决以及彻底解决时差问题

    这篇文章主要给大家介绍了关于SpringBoot时区问题解决以及彻底解决时差问题的相关资料,spring boot作为微服务简易架构,拥有其自身的特点,快速搭建架构,简单快捷,需要的朋友可以参考下
    2023-08-08

最新评论