ThreadPoolExecutor的的核心线程回收设置allowCoreThreadTimeOut

2023-05-16

如果你对ThreadPoolExecutor的执行还不了解,可以参考有界、无界队列对ThreadPoolExcutor执行的影响这篇文章。

在ThreadPoolExecutor类中有个allowCoreThreadTimeOut(boolean value)方法,该方法用来设置是否回收在保活时间后依然没没有任务执行核心线程。

下面通过程序来验证该参数的设置,如果你对CountDownLatch不了解,可以参考 并发工具类:等待多线程完成的CountDownLatch,和join的区别

public class PoolThreadRecycling {

    private static final int CORE_POOL_SIZE = 5;
    private static final int MAX_POOL_SIZE = 10;
    private static final int QUEUE_CAPACITY = 1;
    private static final Long KEEP_ALIVE_TIME = 1L;

    private static ThreadPoolExecutor executor = new ThreadPoolExecutor(
            CORE_POOL_SIZE,
            MAX_POOL_SIZE,
            KEEP_ALIVE_TIME,
            TimeUnit.SECONDS,
            new ArrayBlockingQueue<>(QUEUE_CAPACITY),
            new ThreadPoolExecutor.CallerRunsPolicy());
    static {
        //如果设置为true,当任务执行完后,所有的线程在指定的空闲时间后,poolSize会为0
        //如果不设置,或者设置为false,那么,poolSize会保留为核心线程的数量
        executor.allowCoreThreadTimeOut(true);
    }

    public static void main(String[] args) throws InterruptedException {
        CountDownLatch countDownLatch = new CountDownLatch(10);
        for (int i = 1; i <= 10; i++) {
            executor.submit(() -> {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    countDownLatch.countDown();
                }

            });
        }

        System.out.println("poolSize:" + executor.getPoolSize());
        System.out.println("core:" + executor.getCorePoolSize());
        System.out.println("活跃:" + executor.getActiveCount());

        try {
            countDownLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("开始检测线程池中线程数量");
        while (true) {
            Thread.sleep(1000);

            System.out.println("poolSize:" + executor.getPoolSize());
            System.out.println("core:" + executor.getCorePoolSize());
            System.out.println("活跃:" + executor.getActiveCount());
            System.out.println("======");

        }

    }
}

代码中的静态代码块中通过executor.allowCoreThreadTimeOut(true);设置回收核心线程,执行结果如下:

poolSize:9
core:5
活跃:9
开始检测线程池中线程数量
poolSize:1
core:5
活跃:0
======
poolSize:0
core:5
活跃:0
======
poolSize:0
core:5
活跃:0
======

可以看到,当设置为ture时,线程池中的任务都执行完后,线程池中的线程数量是0,因为核心线程也都被回收了。

如果将其设置为false呢,执行结果如下

poolSize:9
core:5
活跃:9
开始检测线程池中线程数量
poolSize:5
core:5
活跃:0
======
poolSize:5
core:5
活跃:0
======

线程池中的任务都执行完后,线程池中核心线程没有被回收。

该属性缺省值为false

这个参数设置成true还是false需要根据你具体的业务判断,如果该业务需要执行的次数并不多,采用多线程只是为了缩短执行的时间,那么可以设置成true,毕竟用完后很长时间才会用到,线程干耗着也是耗费资源的。但是如果是需要较高并发执行的业务,那么可以设置为false,保留着线程,避免每次都得创建线程耗费资源。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ThreadPoolExecutor的的核心线程回收设置allowCoreThreadTimeOut 的相关文章

随机推荐

  • Ubuntu 16.04 如何安装 Python 3.6

    在Ubuntu 16 04版本中 xff0c 系统默认安装 了python 2 7和3 5版本 xff0c 此次安装的是新版本Python 3 6 13 由于系统已经默认安装了Python xff0c 所以相关的依赖文件已经安装妥善 xff
  • ubnutu桌面环境Gnome 配置tweak tool时看不到extension插件选项

    问题 xff1a tweak tool中没用extension选项 xff0c 这是因为没有开启gnome xff0c 解决方法是注销当前用户 然后在登录窗口的右上角 xff0c 选择gnome xff0c 如下图所示 然后在弹出的窗口中选
  • C# 内存与性能优化

    C 内存与性能优化 https www jianshu com p d56f79d83ebd 前两周分享了资源配置与资源管理 xff0c 今天分享一种特殊的资源脚本数据 在Unity项目中 xff0c 我们通常使用C 编写脚本 xff0c
  • 转发——从搭建小系统到架构分布式

    从搭建小系统到架构分布式 从搭建小系统到架构分布式 SpringBoot是目前Spring技术体系中炙手可热的框架之一 既可用于构建业务复杂的企业应用系统 xff0c 也可以开发高性能和高吞吐量的互联网应用 Spring Boot 框架降低
  • 2018-8-30华为机试第三题

    一个很明显的递归问题 package cn csu ksh import java util ArrayList import java util List import java util Scanner public class Mai
  • Android学习之Sensor

    转自http javatest blog 163 com blog static 20865106420126216118757 只需要五步 xff0c 你就能搞定Sensor 让你的程序变的更酷 java view plain copy
  • 虚拟现实技术vr可以用来干什么?虚拟现实技术vr有什么特征

    科技行业的不断蓬勃发展 xff0c 每天会出现一些新的科技产品 xff0c 例如现在很火的虚拟现实技术vr xff0c 虚拟现实技术用的领域很多 xff0c 就拿游戏行业来说 xff0c 玩家可以通过vr眼镜 vr手柄等体验vr游戏 xff
  • Ubuntu18.04安装Qt5.14.2

    1 去官网 xff08 https download qt io archive qt xff09 下载对应的 run版本 这里是5 14 2 2 进入下载后的路径 xff0c 先赋予权限 xff0c 再安装 span class toke
  • Python归并排序

    归并排序 数据科学家每天都在处理算法 然而 xff0c 数据科学学科作为一个整体已经发展成为一个不涉及复杂算法实现的角色 尽管如此 xff0c 从业者仍然可以从建立对算法的理解和知识库中受益 在本文中 xff0c 对排序算法归并排序进行了介
  • Android ADB 源码分析总结

    Android之ADB总结 本文内容如下 xff1a 1 makefile分析及总结 2 adb框架介绍 3 adbd源码分析 3 1 adbd初始化流程分析 3 2 adb shell流程分析 3 3 adb root流程分析 4 adb
  • android4.0新控件Switch方法解析

    就是很像开关的那种控件 xff0c 它只有两个状态 xff1a on和off xff1a 在IOS中 xff0c 有个UISwitch控件 xff0c 其效果图 xff0c 如下 xff1a 在android4 0里面 xff0c 添加了一
  • Android Adb 源码分析(一)

    扭起屁股得意洋洋 最近 xff0c 我负责的项目因为临近量产 xff0c 把之前的userdebug版本关闭 xff0c 转成了user版本 xff0c 增加selinux的权限 xff0c 大家都洋溢在项目准备量产的兴奋和喜悦之中不能自拔
  • ADB源码分析(一)——ADB模块简述

    原文地址 http www apkbus com blog 50331 54609 html 感谢作者的分享 1 Adb 源码路径 system core adb 2 要想很快的了解一个模块的基本情况 xff0c 最直接的就是查看该模块的A
  • Git分支管理规范

    一 分支与角色说明 Git 分支类型 master 分支 xff08 主分支 xff09 稳定版本 develop 分支 xff08 开发分支 xff09 最新版本 release 分支 xff08 发布分支 xff09 发布新版本 hot
  • Kindeditor编辑器 jsp上传错误解决方法 与struts2冲突整合

    上传使用的是upload json jsp文件 xff0c 问题关键在于struts2对于struts2过滤访问的jsp时 xff0c 会改变reqeust的类型 xff0c 由HttpServletRequest变成MultiPartRe
  • Android中Dialog和Toast及其Snackbar的使用和区别

    一 Snackbar的使用 连接地址 http www jcodecraeer com a anzhuokaifa androidkaifa 2015 0714 3187 html 如果说Dialog和Toast是两个极端的话 xff0c
  • 国外SAP自由顾问的价格

    http scnblogs techweb com cn sapfreelancer archives 19 html 非常感谢我的一位在海外做SAP猎头的朋友 xff0c 他做SAP猎头已经七年了 xff0c 而且不久前刚刚离职 xff0
  • ping的详细过程

    ping是我们在Linux中测试网络连接的常用指令 首先ping是应用程序 xff0c 而不是协议 xff0c 它利用ICMP Internet control message protocol 因特网控制报文协议 报文检测网络连接 首先假
  • Android studio 之 Kotlin Not Configured

    Build报错 xff1a Index is not created for Stubs AndroidStudio 爆以下错误 xff1a com intellij ide plugins StartupAbortedException
  • ThreadPoolExecutor的的核心线程回收设置allowCoreThreadTimeOut

    如果你对ThreadPoolExecutor的执行还不了解 xff0c 可以参考有界 无界队列对ThreadPoolExcutor执行的影响这篇文章 在ThreadPoolExecutor类中有个allowCoreThreadTimeOut