Java多线程中的ThreadPoolExecutor解读

 更新时间:2023年09月15日 10:07:34   作者:「已注销」  
这篇文章主要介绍了Java多线程中的ThreadPoolExecutor解读,线程池中的核心线程数,当提交一个任务时,线程池创建一个新线程执行任务,直到当前线程数等于corePoolSize;如果当前线程数为corePoolSize,继续提交的任务被保存到阻塞队列中,等待被执行,需要的朋友可以参考下

corePoolSize

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

maximumPoolSize

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

keepAliveTime

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

unit

keepAliveTime参数的时间单位。

workQueue

任务缓存队列,用来存放等待执行的任务。如果当前线程数为corePoolSize,继续提交的任务就会被保存到任务缓存队列中,等待被执行。 一般来说,这里的BlockingQueue有以下三种选择:

1.SynchronousQueue:一个不存储元素的阻塞队列,每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态。因此,如果线程池中始终没有空闲线程(任务提交的平均速度快于被处理的速度),可能出现无限制的线程增长。

2.LinkedBlockingQueue:基于链表结构的阻塞队列,如果不设置初始化容量,其容量为Integer.MAX_VALUE,即为无界队列。因此,如果线程池中线程数达到了corePoolSize,且始终没有空闲线程(任务提交的平均速度快于被处理的速度),任务缓存队列可能出现无限制的增长。

3.ArrayBlockingQueue:基于数组结构的有界阻塞队列,按FIFO排序任务。

threadFactory

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

handler

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

1.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常,默认策略;

2.CallerRunsPolicy:由调用execute方法的线程执行该任务;

3.DiscardPolicy:丢弃任务,但是不抛出异常;

4.DiscardOldestPolicy:丢弃阻塞队列最前面的任务,然后重新尝试执行任务(重复此过程)。 当然也可以根据应用场景实现RejectedExecutionHandler接口,自定义饱和策略,如记录日志或持久化存储不能处理的任务。

public static void main(String[] args) {
    int corePoolSize = 0;
    int maximumPoolSize = 0;
    long keepAliveTime = 0;
    TimeUnit unit = TimeUnit.SECONDS;
    //1.SynchronousQueue:一个不存储元素的阻塞队列,每个插入操作必须等到另一个线程调用移除操作,
    //否则插入操作一直处于阻塞状态。因此,如果线程池中始终没有空闲线程(任务提交的平均速度快于被处理的速度),
    //可能出现无限制的线程增长。
    //2.LinkedBlockingQueue:基于链表结构的阻塞队列,如果不设置初始化容量,
    //其容量为Integer.MAX_VALUE,即为无界队列。因此,如果线程池中线程数达到了corePoolSize,
    //且始终没有空闲线程(任务提交的平均速度快于被处理的速度),任务缓存队列可能出现无限制的增长。
    //3.ArrayBlockingQueue:基于数组结构的有界阻塞队列,按FIFO排序任务。
    BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(100);
    ThreadFactory threadFactory = new ThreadFactory() {
      @Override
      public Thread newThread(Runnable r) {
        return new Thread("newThread");
      }
    };
    //1.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常,默认策略;
    //2.CallerRunsPolicy:由调用execute方法的线程执行该任务;
    //3.DiscardPolicy:丢弃任务,但是不抛出异常;
    //4.DiscardOldestPolicy:丢弃阻塞队列最前面的任务,然后重新尝试执行任务(重复此过程)。
    RejectedExecutionHandler handler = new RejectedExecutionHandler() {
      @Override
      public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
      }
    };
    ThreadPoolExecutor threadPoolExecutor = 
        new ThreadPoolExecutor(
            corePoolSize, 
            maximumPoolSize, 
            keepAliveTime,
            unit, 
            workQueue);
    ThreadPoolExecutor threadPoolExecutor1 = 
        new ThreadPoolExecutor(
            corePoolSize, 
            maximumPoolSize, 
            keepAliveTime,
            unit, 
            workQueue, 
            threadFactory);
    ThreadPoolExecutor threadPoolExecutor2 = 
        new ThreadPoolExecutor(
            corePoolSize, 
            maximumPoolSize, 
            keepAliveTime, 
            unit, 
            workQueue, 
            handler);
    ThreadPoolExecutor threadPoolExecutor3 = 
        new ThreadPoolExecutor(
            corePoolSize, 
            maximumPoolSize, 
            keepAliveTime, 
            unit, 
            workQueue, 
            threadFactory, 
            handler);
  }

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

相关文章

  • Servlet系列两种创建方式

    Servlet系列两种创建方式

    本文主要介绍了Servlet系列两种创建方式,包含Servlet2.5之前使用和Servlet3.0后,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-02-02
  • Java中的原生post请求方式

    Java中的原生post请求方式

    这篇文章主要介绍了Java中的原生post请求方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • 解决2022.3.1版本中 IDEA中 XML文件提示屎黄色背景的方法

    解决2022.3.1版本中 IDEA中 XML文件提示屎黄色背景的方法

    这篇文章主要介绍了解决2022.3.1版本中 IDEA中 XML文件屎黄色背景 的方法,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-01-01
  • 深入Java Robot实现控制鼠标和键盘的方法详解

    深入Java Robot实现控制鼠标和键盘的方法详解

    本篇文章是对Java中用Robot实现控制鼠标和键盘的方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • MyBatis自动生成Where语句

    MyBatis自动生成Where语句

    这篇文章主要介绍了MyBatis自动生成Where语句的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-08-08
  • java实现简易超市管理系统 附源码下载

    java实现简易超市管理系统 附源码下载

    这篇文章主要介绍了java实现简易超市管理系统(含源码),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • SpringBoot mybatis-plus使用json字段实战指南

    SpringBoot mybatis-plus使用json字段实战指南

    在现代应用开发中经常会使用JSON格式存储和传输数据,为了便捷地处理数据库中的JSON字段,MyBatis-Plus提供了强大的JSON处理器,这篇文章主要给大家介绍了关于SpringBoot mybatis-plus使用json字段的相关资料,需要的朋友可以参考下
    2024-01-01
  • 散列表的原理与Java实现方法详解

    散列表的原理与Java实现方法详解

    这篇文章主要介绍了散列表的原理与Java实现方法,详细分析了散列表的原理,并结合实例形式分析了java实现散列表相关操作技巧,需要的朋友可以参考下
    2019-09-09
  • 举例解析Java多线程编程中需要注意的一些关键点

    举例解析Java多线程编程中需要注意的一些关键点

    这篇文章主要介绍了Java多线程编程中需要注意的一些关键点,包括ThreadLocal变量与原子更新等一些深层次的内容,需要的朋友可以参考下
    2015-11-11
  • Java遍历Map对象的四种方式

    Java遍历Map对象的四种方式

    本文给大家介绍java遍历map对象的四种方式,对java中遍历map感兴趣的朋友可以一起了解了解
    2015-10-10

最新评论