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解读内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springboot配置ldaps连接方式

    springboot配置ldaps连接方式

    这篇文章主要介绍了springboot配置ldaps连接方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • SpringBoot-Maven打包压缩瘦身方式

    SpringBoot-Maven打包压缩瘦身方式

    这篇文章主要介绍了SpringBoot-Maven打包压缩瘦身方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • SpringBoot整合Guava Cache实现全局缓存的示例代码

    SpringBoot整合Guava Cache实现全局缓存的示例代码

    这篇文章主要介绍了SpringBoot整合Guava Cache实现全局缓存,Guava Cache是Google Guava库中的一个模块,提供了基于内存的本地缓存实现,文中介绍了SpringBoot整合使用Guava Cache的具体步骤,需要的朋友可以参考下
    2024-03-03
  • Python单元测试_使用装饰器实现测试跳过和预期故障的方法

    Python单元测试_使用装饰器实现测试跳过和预期故障的方法

    下面小编就为大家带来一篇Python单元测试_使用装饰器实现测试跳过和预期故障的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • SpringBoot 嵌入式web容器的启动原理详解

    SpringBoot 嵌入式web容器的启动原理详解

    这篇文章主要介绍了SpringBoot 嵌入式web容器的启动原理详解,具有很好的参考价值,希望对大家有所帮助。
    2021-11-11
  • Java8对List排序的方法大全

    Java8对List排序的方法大全

    这篇文章主要给大家介绍了关于Java8对List排序的方法大全,其实Java针对数组和List的排序都有实现,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • Maven中plugins与pluginManagement的区别说明

    Maven中plugins与pluginManagement的区别说明

    这篇文章主要介绍了Maven中plugins与pluginManagement的区别说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • 详解JAVA中static的作用

    详解JAVA中static的作用

    这篇文章主要介绍了JAVA中static的作用,文中讲解非常细致,代码帮助大家更好的理解,感兴趣的朋友可以了解下
    2020-06-06
  • springMVC如何将controller中数据传递到jsp页面

    springMVC如何将controller中数据传递到jsp页面

    这篇文章主要介绍了springMVC如何将controller中数据传递到jsp页面,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • Java ByteBuffer网络编程用法实例解析

    Java ByteBuffer网络编程用法实例解析

    这篇文章主要介绍了Java ByteBuffer网络编程用法实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10

最新评论