ThreadPoolExecutor的keepAliveTime=0说明

点击上方☝,轻松关注!及时获取有趣有料的技术文章如题,如下图,解释ThreadPoolExecutor的keepAliveTime=0。上图来自《并发编程的艺术》一书,书中有下面一段描…

大家好,又见面了,我是全栈君。

点击上方☝,轻松关注!及时获取有趣有料的技术文章

ThreadPoolExecutor的keepAliveTime=0说明

如题,如下图,解释 ThreadPoolExecutor的keepAliveTime=0

ThreadPoolExecutor的keepAliveTime=0说明

上图来自《并发编程的艺术》一书,书中有下面一段描述:

“当线程池中的线程数大于corePoolSize时,keepAliveTime 为多余的空闲线程等待新任务的最长时间, 超过这个时间后多余的线程将被终止。这里把keepAliveTime设置为0L,意味着多余 的空闲线程会被立即终止。”

网上很多博客资料都是说的0表示在空闲的时候线程永久存活。其实是不准确的。

附上验证代码:

public static void main(String[] args) throws InterruptedException {
        // 创建了一个线程池
        ThreadPoolExecutor executor = new ThreadPoolExecutor(1,
                2,
                0, TimeUnit.SECONDS,
                new LinkedBlockingQueue<Runnable>(1));

        for (int i = 0; i < 3; i++) {
            executor.execute(new DemoTask(i));
        }

        while (true) {
            System.out.println("总线程数:" + executor.getPoolSize() + ", 当前活跃线程数:" + executor.getActiveCount());
            TimeUnit.SECONDS.sleep(1);
        }
    }

    static class DemoTask implements Runnable {
        int num;

        public DemoTask(int i) {
            this.num = i;
        }

        @Override
        public void run() {
            System.out.println("num=" + num + " Thread = " + Thread.currentThread().getName());
            if (num >= 1) {
                try {
                    TimeUnit.SECONDS.sleep(1);
                    System.out.println("num=" + num + " sleep 1 s结束");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            } else {
                try {
                    TimeUnit.SECONDS.sleep(3);
                    System.out.println("num=" + num + " sleep 3 s结束");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

打印结果:

num=2 Thread = pool-1-thread-2
总线程数:2, 当前活跃线程数:2
num=0 Thread = pool-1-thread-1
num=2 sleep 1 s结束
num=1 Thread = pool-1-thread-2
总线程数:2, 当前活跃线程数:2
num=1 sleep 1 s结束
总线程数:1, 当前活跃线程数:1
num=0 sleep 3 s结束
总线程数:1, 当前活跃线程数:1
总线程数:1, 当前活跃线程数:0
总线程数:1, 当前活跃线程数:0

 任务一执行完,大 于 corePoolSize 数的空闲线程立马嗝屁。

本篇完~

推荐阅读

深入理解 Java 线程池,讲解的太清晰了

【强制】-为什么阿里要禁用 Executors 创建线程池?

ThreadPoolExecutor的keepAliveTime=0说明

ThreadPoolExecutor的keepAliveTime=0说明

一个技术人珍藏的武学秘籍ThreadPoolExecutor的keepAliveTime=0说明

点亮在看ThreadPoolExecutor的keepAliveTime=0说明

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/120971.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • sql server可以定义的约束_数据库常见约束

    sql server可以定义的约束_数据库常见约束SQLserver常见的约束条件1.检查只能是男或者女Sexin(‘男,女’)),Sex=‘男’orsex=‘女’)2.在一个范围中间Sage>0andsage<120Sagebetween12and303.长度大于某个值len(pwd)>6)//pwd为密码字段4.数大于某个值Sage>15.只能是8位字符,前两…

    2022年10月13日
  • static–静态变量与普通变量的区别

    static–静态变量与普通变量的区别静态变量与普通变量的区别全局变量(外部变量)的说明之前再冠以static就构成了静态的全局变量。全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,…

  • uwsgi模式_uwsgi配置详解[通俗易懂]

    uwsgi模式_uwsgi配置详解[通俗易懂]#先激活virtualenv#启动:uwsgiuwsgi.ini#停止:uwsgi–stopuwsgi.pid[uwsgi]#对外提供http服务的端口http=:8000#thelocalunixsocketfilethancommnuincatetoNginx用于和nginx进行数据交互的端口socket=127.0.0.1:8001#the…

  • MySQL-深入分析MySQL ERROR 1045出现的原因

    MySQL-深入分析MySQL ERROR 1045出现的原因1

  • 无人机wifi图传模块(手机远程控制)

    现在手机的省内流量也便宜了,是时候考虑用手机3G,4G网络来超远程控制无人机、无人车、无人船了。超远程的意思是经过IP互联网,可以操控另一个城市或另一个国家的无人机。网灵科技的“全球鹰”无人机远程控制模块就是这个思路。既然是DIY,那么就要省钱,咱不买“全球鹰”远控模块,就用个闲置的安卓手机放到无人机上去吧,手机可以3G、4G上网,手机摄像头可以做图传用,手机再想办法跟飞控的数传口连接通信,实现数传和远程手柄遥控。

  • Html 表格

    Html 表格

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号