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

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


相关推荐

  • 实验室设备管理系统c语言程序设计_设备管理系统怎么实现

    实验室设备管理系统c语言程序设计_设备管理系统怎么实现#include#include#includetypedefstructequipment{intnum;//编号charname[20];//名称charmodel[20];//型号charfactory[20];//厂家charbuy_date[20];//购买日期struc

    2022年10月13日
    0
  • [NOIp2009]潜伏者 题解「建议收藏」

    [NOIp2009]潜伏者 题解「建议收藏」"题面"做法:模拟我们先定义三个char数组:a小C掌握的一条加密信息b加密信息所对应的原信息cR国司令部要求小C翻译的加密信息具体做法:1.读入(不讲)

    2022年7月3日
    19
  • jmeter线程组的属性_netty线程模型详解

    jmeter线程组的属性_netty线程模型详解情境:最近用winform做一个小程序,主要是用来执行一些sql语句,无奈数据量太大,执行一次要二十分钟左右,执行期间界面根本不能再进行其它操作,就连最小化窗口都不行,一动就跟死机差不多了.因此到网上搜了一下,找到.net后台线程的概念.(高手请绕道!)前台线程和后台线程之间的选择.NETFramework中的所有线程都被指定为前台线程或后台线程。这两种线程唯一的区别是—后台线程不会

    2022年10月11日
    0
  • linux安装mysql8.0.16_mysql安装配置教程

    linux安装mysql8.0.16_mysql安装配置教程1.在/use/local下创建mysql文件夹mkdirmysql2.切换到mysql文件夹下cdmysql3.下载mysqlwgethttps://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz也可以直接在官方下载最新版本https://dev.mysql.com/downloads/mysql/选择linux4.解压mysqltar-zx……..

    2022年10月13日
    0
  • js中获取html元素之document.documentElement

    js中获取html元素之document.documentElementdocument.documentElementDocument.documentElement是一个会返回文档对象(document)的根元素的只读属性(如HTML文档的<html>元素)。对于任何非空HTML文档,调用document.documentElement总是会返回一个<html>元素,且它一定是该文档的根元素。借助这个只读属性,能方便地获取到任意文档的根元素。参考文档html中document.body与document.d

    2022年7月19日
    24
  • conn.setRequestProperty_session.getattribute获取的值为空

    conn.setRequestProperty_session.getattribute获取的值为空问题背景项目中碰到调用其他厂家的接口,厂家不仅提供了接口文档还提供了调用基类,但是使用厂家提供的基类调用其服务确失败。看了源码之后发现是connection.setRequestProperty(“host”,”xxxx”)没有设置成功,导致厂家不能识别到host的值。问题原因一个属性能不能加到request中,由allowRestrictedHeaders和restrictedHeader…

    2022年9月10日
    0

发表回复

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

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