java线程池参数_java线程池参数设置原则,如何设置线程池参数比较合理?[通俗易懂]

java线程池参数_java线程池参数设置原则,如何设置线程池参数比较合理?[通俗易懂]线程池的参数应该怎样设置呢?相信对于很多的人来说这也是一个比较难的问题,下面就让我们一起来解决一下,究竟应该如何设置线程池的参数才是最合理的吧!首先在设置参数的时候,有以下的几点是我们需要考虑到的!1、下游系统抗并发的能力多线程给下游系统造成的并发等于你设置的线程数例:假如,是多线程访问数据库,那么就得考虑数据库的连接池大小设置,数据库并发太多影响其qps,会将数据库打挂等问题。假如,是访问下游系…

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

线程池的参数应该怎样设置呢?相信对于很多的人来说这也是一个比较难的问题,下面就让我们一起来解决一下,究竟应该如何设置线程池的参数才是最合理的吧!

首先在设置参数的时候,有以下的几点是我们需要考虑到的!

1、下游系统抗并发的能力

多线程给下游系统造成的并发等于你设置的线程数

例:

假如,是多线程访问数据库,那么就得考虑数据库的连接池大小设置,数据库并发太多影响其qps,会将数据库打挂等问题。

假如,是访问下游系统的接口,那么就得考虑下游系统是否可以抗得住这么多的并发量,不可以将下游系统打挂了。

2、CPU使用率

在线程数设置的比较大的时候,那么就会出现以下的几个问题:

(1)线程的初始化,切换,销毁等操作会消耗比较多的cpu资源,从而使得cpu利用率一直维持在比较高的水平。

(2)线程数比较大的时候,任务会短时间迅速执行,任务的集中执行会给cpu造成比较大的压力。

(3)任务的集中支持,会使得cpu的使用率呈现锯齿状,也就是说在短时间内cpu升高,之后,迅速下降到闲置状态。

cpu使用的不合理,应该减小线程数,让任务在队列等待,使得cpu的使用率应该持续稳定在一个合理,平均的数值范围。

所以,在cpu在够用的时候,不应该过大,注意,并不是越大越好。

这个时候,可以通过上线之后,观察机器的cpu使用率和cpu负载,观察这两个参数来判断线程数是否合理。

能够通过命令查看cpu使用率是不是主要花在线程切换上。

cpu负载是正在执行的线程和等待执行的线程之和。

注意了,这里的等待指的是线程处在running状态,可是,还没有被cpu调度的等待,负载较高,也就意味着cpu竞争激烈,进而的说明,线程设置的比较大,在抢cpu资源。

负载的值通常约等于cpu核数是比较合理的数值。

3、线程池中执行的任务性质

计算密集型的任务比较占cpu,所以说,通常线程数设置的大小等于或者是略微大于cpu的核数。

可是,IO型任务主要时间消耗在IO等待上,cpu压力不是很大,所以,线程数一般设置的比较的大。

例:

多线程访问数据库,数据库有128个表,这样的话,就直接考虑使用128个线程。

4、内存使用率

线程数过多以及队列的大小对于这个数据都会造成影响。

队列的大小应该通过前期计算线程池任务的条数,来合理的设置队列的大小,不适合太小,让它不会溢出,因为,溢出会走拒绝策略,多多少少对于它的性能会造成一定的影响,与此同时,复杂度也会被增加,所以,这里需要我们好好的考量拒绝策略的选择。

拒绝策略包括了AbortPolicy(抛异常), CallerRunsPolicy(主线程执行) 和

DiscardPolicy(丢弃),也不适合过大,过大的话也用不上,还会消耗比较大的内存。

以上的四点是我们一定要去考虑的,之后给大家介绍一个很多人都会容易犯的错误。

如下:

线程池的配置

这里的话,发现任务执行的比较慢,机器的cpu,内存等也比较的低,所以,做出了加大线程的决定。

大约还需要100个线程,所以修改配置:

问题:

线程池是不是要创建新的线程,要做以下考虑:

1、假如,线程数小于corePoolSize,那么就直接添加新的线程。

2、假如,线程数大于等于corePoolSize,那么就放进队列进行等待,假如,放进队列成功了,那么就不添加新的线程。

3、假如对列满了,线程数小于maxPoolSize,那么就会新建线程,假如,大于maxpoolSize,那么就会走到拒绝策略。

所以,队列设置较大,一般来说是不会满,所以线程数其实是一直达不到maxPoolSize的,所以,其实一致用的是50个线程。

解决:

将核心线程和最大线程设置成一个值,都为100就可以了。

bbca0e2252eaa0d348a42fc5d09173d7.png

以上就是对于线程池参数设置的一个简单介绍了,你都了解了吗?更多内容,请继续关注奇Q工具网的常见问题栏目了解吧。

推荐阅读:

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

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

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


相关推荐

  • Java常用代码_计算机植入木马程序

    Java常用代码_计算机植入木马程序1.字符串有整型的相互转换Stringa=String.valueOf(2);//integertonumericstringinti=Integer.parseInt(a);//numericstringtoanint2.向文件末尾添加内容BufferedWriterout=null;try{out=newBu…

    2025年6月12日
    16
  • allow_url_fopen设置

    allow_url_fopen设置使用file,fopen或file_get_contents函数打开远程url时,需要PHP配置中(php.ini)将allow_url_fopen的值设置为On。按照默认设置,这个值本身就是On的。如果allow_url_fopen已经为on,但file,fopen,file_get_contents依然报错,就是服务器的DNS问题,造成了路由结果中有部份路由执行超时,最终PHP执行…

    2022年7月16日
    28
  • Linux Platform devices 平台设备驱动

    Linux Platform devices 平台设备驱动platform平台设备驱动是基于设备总线驱动模型的,它只不过是将device进一步封装成为platform_device,将device_driver进一步封装成为platform_device_driver,前面已经分析过设备总线驱动模型,关于device与device_driver的注册过程以及它们在sysfs文件系统中的层次关系就不在分析,本文重点分析platform平台

    2022年7月24日
    9
  • OA工作流的定义

    OA工作流的定义OA工作流就是建立于网络办公自动化基础上的事务行政审批,业务申请审批、公文、信息等的网上流转。OA工作流类别.OA工作流软件从不同的角度,有许多不同的分类方法,比如依据底层技术分类、依据任务传递机制分类、根据所实现的业务过程等,我们从用户角度出发,由于用户购买软件其最根本的出发点是改善管理转载于:https://www.cnblogs.com/jiang–nan/p/8664959.html…

    2022年6月23日
    31
  • handlersocket mysql,MySQL插件HandlerSocket

    handlersocket mysql,MySQL插件HandlerSocketHandlerSocket是MySQL的一个插件,用来实现NoSQL功能,用于跳过MySQL的SQL层面,直接访问内部的InnoDB存储引擎。wgethttp://dev.mysql.com/get/Downloads/MySQL-5.5/MySQL-client-5.5.11-1.rhel4.i386.rpmwgethttp://dev.mysql.com/get/Downloads/…

    2022年8月24日
    7
  • docker无法访问宿主机_docker访问宿主机端口

    docker无法访问宿主机_docker访问宿主机端口背景已通过docker启动mongodb,监听端口为27017.直接启动应用(不通过docker)可以正常访问到mongodb,但是通过docker访问却不行,访问的url为:mongodb://127.0.0.1:27017或mongodb://localhost:270172019-04-1806:05:52.694[cluster-ClusterId{value=’5cb813…

    2022年8月21日
    15

发表回复

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

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