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

线程池参数调优「建议收藏」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倍。

注意

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

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

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

关注个人公众号

在这里插入图片描述

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

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

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

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

(0)


相关推荐

  • iOS-class方法和objc_getClass方法

    iOS-class方法和objc_getClass方法根据上一篇博客iOS-class、object_getClass、objc_getClass、objc_getMetaClass区别的研究发现,qi’s

  • mysql将字符串转为数字

    mysql将字符串转为数字MySQL字符串+0即可转为数字:&lt;!–查找版本是否满足区间–&gt;&lt;selectid="isVersion"resultType="java.lang.String"parameterType="map"&gt;SELECTversion_idfromjob_release_versionwheresrc_ver…

  • 身份验证错误 要求的函数不受支持 Windows远程桌面连接

    身份验证错误 要求的函数不受支持 Windows远程桌面连接PhpStorm绝对是PHP开发最好的开发工具。之前好好的能远程桌面连接到服务器,但是今天来就不能连接上了,并提示:身份验证错误。要求的函数不受支持。猜想可能是Windows又更新了什么鬼,后面查询资料知道是由于CredSSP加密Oracle修正的原因,这里我整理了下解决方案,希望能帮到你。微软给出解决方案:https://support.microsoft.com/zh-…

  • JAVA——数组截取——调用库中方法

    JAVA——数组截取——调用库中方法1,使用Java类库中的方法System.arraycopy2,使用Java类库中的方法java.util.Arrays.copyOf3,重写myCopy(一)使用.arraycopy方法使用方法:System.arraycopy(源数组名称,源数组开始点,目标数组名称,目标数组开始点,拷贝长度);说明:将arr1数组中的一部分替换成arr2数组中的一部分可以从任意位置开始截取…

  • Platform device and platform driver

    Platform device and platform driverPlatformdevice是专门给嵌入式系统设计的设备类型,一般在移植内核到自己的开发板时,基本上注册的所有的设备的类型全是platformdevice。实际上,platform在Linux内核中是以一条总线的身份登场的,要想让这样的总线和设备一起完美的工作,必须首先在系统

  • phpstorm 2022.01.21激活【最新永久激活】[通俗易懂]

    (phpstorm 2022.01.21激活)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

发表回复

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

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