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)


相关推荐

发表回复

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

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