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

线程池参数调优「建议收藏」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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • jquery正则表达式验证邮箱_正则表达式如何判断邮箱

    jquery正则表达式验证邮箱_正则表达式如何判断邮箱我的代码一开始如下:然后我的表单就一直没法成功调用这个函数,后面我发现,这里的跟java的不一样,reg里的正则表达式必须得用’/’,双引号赋值它不识别,还有下面调用test函数,上面if语句里面验证邮箱是否正确,用的email.test(reg),它打开网页还是没有提示。得像下面这个才能正常调用test。…

    2022年9月20日
    0
  • tortoisegit 创建远程分支_git强制切换分支

    tortoisegit 创建远程分支_git强制切换分支公司项目GIT中有好几个分支,第一次使用提交错了,被教育了研究出来并记录一下使用TortoiseGit切换远程分支的方法第一步第二步

    2022年9月21日
    0
  • ALLuxio_Alluxio公司怎么样

    ALLuxio_Alluxio公司怎么样一、什么是AlluxioAlluxio(之前名为Tachyon)是世界上第一个以内存为中心的虚拟的分布式存储系统。它统一了数据访问的方式,为上层计算框架和底层存储系统构建了桥梁。应用只需要连接Alluxio即可访问存储在底层任意存储系统中的数据。此外,Alluxio的以内存为中心的架构使得数据的访问速度能比现有常规方案快几个数量级。在大数据生态系统中,Alluxio介于计算框架(如Apache…

    2022年10月22日
    0
  • sql系列(基础)-第二章 限制和排序数据

    sql系列(基础)-第二章 限制和排序数据

    2022年1月2日
    39
  • linux系统退出vim

    linux系统退出vim在linux家族中,vim编辑器是系统自带的文本编辑器,其功能强大自不必说了。进入VI编辑器后,无法退出以致强抽关机,确是不得以呀。进入VIM编辑器1 VIM编辑器,可以新建文件也可以修改文件,命令为:vim /usr/local/con.cfg如图!2 如果这个文件,以前是没有的,则为新建,则下方有提示为新文件,如图。如果文件已存在,则没有提示。3 进入编辑器后,我们先按"I”,即切换到“插入…

    2022年5月15日
    75
  • 日志审计系统如何和服务器互联,服务器如何查看审计日志[通俗易懂]

    日志审计系统如何和服务器互联,服务器如何查看审计日志[通俗易懂]服务器如何查看审计日志内容精选换一换云审计CTS与LTS进行系统对接后,系统自动在云日志服务控制台创建的日志组和日志流,如果需要将CTS的日志转储至OBS中,您需要进行以下操作:在云审计服务管理控制台,单击左侧导航栏中的“追踪器”。单击追踪器“system”右侧的“配置”。在“配置追踪器”页面,开启“事件分析”。在云日志服务管理控制台,选择左侧导航栏中的“日志转储”,单击“如果变更规格失败,请到…

    2022年6月4日
    60

发表回复

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

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