线程池参数调优「建议收藏」

线程池参数调优「建议收藏」ThreadPoolExecutorThreadPoolExecutor构造函数的五大参数publicThreadPoolExecutor(intcorePoolSize,intmaximumPoolSize,longkeepAliveTime,…

大家好,又见面了,我是你们的朋友全栈君。

ThreadPoolExecutor

ThreadPoolExecutor构造函数的五大参数

 public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue) { 
   
        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
             Executors.defaultThreadFactory(), defaultHandler);
    }
  • corePoolSize 核心线程数,表示线程池支持的最小线程数
  • maximumPoolSize 最大线程数,当线程数大于核心线程数后,并且有界队列里存放能时,线程池还能接受maximumPoolSize – corePoolSize个线程
  • keepAliveTime 保持存活时间,空闲线程的存活时间,为了更好的复用线程
  • unit 线程存活时间的单位
  • workQueue 队列,等待线程存放的队列

提问:如下线程池同一时间最多能接受多少个线程?

 ThreadPoolExecutor pool = new ThreadPoolExecutor(2,5,10L, TimeUnit.SECONDS,new ArrayBlockingQueue<>(5));

答案是10个,等待队列里5个,最大线程数5个,多的线程请求将会被拒绝,异常如下
在这里插入图片描述
线程池的处理流程:
在这里插入图片描述
逻辑流程图
在这里插入图片描述

写个demo压测下线程池

public class ThreadPoolDemo { 
   

    public static void main(String[] args) { 
   

        ThreadPoolExecutor pool = new ThreadPoolExecutor(80,150,10L, TimeUnit.SECONDS,new ArrayBlockingQueue<>(200));
        long start = System.currentTimeMillis() / 1000;
        IntStream.range(0,500).forEach(i ->{ 
   
            pool.submit(new MyThread());
            try { 
   
                Thread.sleep(3L);
            } catch (InterruptedException e) { 
   
                e.printStackTrace();
            }
        });
        pool.shutdown();
        System.out.println("use time " + (System.currentTimeMillis() / 1000 - start) + "秒");

    }

   static class MyThread implements Runnable{ 
   

       @Override
        public void run() { 
   
            try { 
   
                Thread.sleep(500L);
                System.out.println(Thread.currentThread().getName()+" run ....");
            } catch (InterruptedException e) { 
   
                e.printStackTrace();
            }
        }
    }
}

执行结果
在这里插入图片描述
执行500个耗时0.5秒的操作用时2秒,速度提升了125倍。

注意

线程池的参数设置一定要甚重,当并发过高时,等待队列和最大线程数都到极限时,线程池就会采用一定的拒绝策略拒绝任务,这个一定要根据业务场景考虑。

另外还有一点队列尽量选用有界队列,否则最大线程数是没有意义的,潜在风险就是内存会爆。

【以上仅是个人观点,如有错误欢迎指证】

关注个人公众号

在这里插入图片描述

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

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/135065.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mysql如何查询前10个数据_查询前十条数据

    mysql如何查询前10个数据_查询前十条数据要选择前10条记录,请在MySQL中使用LIMIT。让我们首先创建一个表-mysql>createtableDemoTable->(->PageNumbertext->);使用插入命令在表中插入一些记录-mysql>insertintoDemoTablevalues(‘Page-1’);mysql>insertintoDemoTabl…

    2025年10月3日
    3
  • 2022考研数学一考试大纲最新_数学一考研大纲2021官方

    2022考研数学一考试大纲最新_数学一考研大纲2021官方2022年考研数学1考试大纲(2022年)

    2022年8月11日
    10
  • linux中systemctl详细理解及常用命令

    linux中systemctl详细理解及常用命令一、systemctl理解Linux服务管理两种方式service和systemctlsystemd是Linux系统最新的初始化系统(init),作用是提高系统的启动速度,尽可能启动较少的进程,尽可能更多进程并发启动。systemd对应的进程管理命令是systemctl1.systemctl命令兼容了service即systemctl也会去/etc/init.d目录下…

    2022年5月9日
    72
  • java判断集合list是否为空

    java判断集合list是否为空方法有二 其一为 if list null amp amp list size gt 0 判断 list 是否为空 且 list 集合中包含的元素个数小于等于 0 个 其二为 这是最常用的方法 简单便捷使用 isEmpty 方法 isEmpty 判断 list 集合有没有元素 如果有元素返回 false 没有返回 true 如果集合本身设置为 null 则会报

    2025年8月24日
    3
  • 11 如何通过 “副本传输” 传输从DEV到QAS的请求号

    11 如何通过 “副本传输” 传输从DEV到QAS的请求号业务背景:在实际项目中,当顾问在DEV配置系统中做好配置,或者开发顾问在DEV开发系统中做好了开发,生成了请求号后,需要将对应的配置传输到QAS系统(集成测试系统),要想将请求号对应的配置或开发内容从DEV系统传输到QAS系统。常规操作就是需要将请求号进行释放后,在进行传输,但是在实际情况下,很多时候顾问的配置或开发内容并未全部完成或还需要进行局部修改的情况下,副本传输就可以解决既可以不释放请求号,又可以达到跨服务器传输请求号内容的目的了。PS:请求号一旦释放后,就不能再使用同一个请求号进行配置和

    2022年6月28日
    36
  • 初始视觉里程计

    初始视觉里程计视觉里程计

    2022年6月20日
    25

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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