根据CPU核数合理设置线程池大小
一般来说池中总线程数是核心池线程数量两倍,只要确保当核心池有线程停止时,核心池外能有线程进入核心池即可。
我们所需要关心的主要是核心池线程的数量该如何设置。
自定义线程池代码
package com.lc.concurrent;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit; public class MyThreadPoolExecutor {
//最大可用的CPU核数
public static final int PROCESSORS=Runtime.getRuntime().availableProcessors();
//线程最大的空闲存活时间,单位为秒
public static final int KEEPALIVETIME=60;
//任务缓存队列长度
public static final int BLOCKINGQUEUE_LENGTH=500; public ThreadPoolExecutor createThreadPool(){
return new ThreadPoolExecutor(PROCESSORS * 2,PROCESSORS * 4,KEEPALIVETIME,TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(BLOCKINGQUEUE_LENGTH));
}
}
线程中的任务最终是交给CPU的线程去处理的,而CPU可同时处理线程数量大部分是CPU核数的两倍,运行环境中CPU
的核数我们可以通过Runtime.getRuntime().availableProcessors()这个方法而获取。理论上来说核心池线程数量应该为
Runtime.getRuntime().availableProcessors()*2,那么结果是否符合我们的预期呢,可以来测试一下(本次测试测试的
是I/O密集型任务,事实上大部分的任务都是I/O密集型的,即大部分任务消耗集中在的输入输出。而CPU密集型任务主
要消耗CPU资源进行计算,当任务为CPU密集型时,核心池线程数设置为CPU核数+1即可)
package com.lc.concurrent; import java.util.Arrays;
import java.util.Random;
import java.util.concurrent.ThreadPoolExecutor; public class CreateThreads {
public synchronized static void main(String[] args) {
System.out.println(MyThreadPoolExecutor.PROCESSORS);
new CreateThreads().test();
} public synchronized void test(){
ThreadPoolExecutor threadPoolExecutor=new MyThreadPoolExecutor().createThreadPool();
for (int i = 0; i <= 100; i++) {
MyTask myTask = new MyTask(i);
threadPoolExecutor.execute(myTask);
}
threadPoolExecutor.shutdown();
}
} class MyTask implements Runnable{
private int i; public MyTask(int i){
this.i=i;
} @Override
public void run() {
System.out.println("任务"+i+"开始执行"+System.currentTimeMillis());
for (int i=0;i<32766;i++){
Random random=new Random();
int randNum=random.nextInt();
int[] a={1,2,3,4,5,6,9,18,290,238,991,100,19,1932,randNum};
Arrays.sort(a);
Arrays.hashCode(a);
Arrays.stream(a);
}
System.out.println("任务"+i+"结束执行"+System.currentTimeMillis());
}
}
本机CPU核数为4,可同时处理8线程,测试结果如下:
核心池线程数量 执行耗时(毫秒,多次测试结果以/间隔)
4 474/479/471
8 430/436/421
12 432/425/438
16 437/431/449
20 471/481/469
可以发现当线程数量小于CPU核数两倍时速度明显较慢,超过两倍后速度差不多,当核心池数量过多时,速度又会显著下降
由此可以看出,核心池线程数量大小应在CPU核数两倍以上且不宜过多。
所以说,将线程池的核心池线程数量配置为CPU核数的两倍是比较合适的。
根据CPU核数合理设置线程池大小的更多相关文章
- Java-如何合理的设置线程池大小
想要合理配置线程池线程数的大小,需要分析任务的类型,任务类型不同,线程池大小配置也不同. 配置线程池的大小可根据以下几个维度进行分析来配置合理的线程数: 任务性质可分为:CPU密集型任务,IO密集型任 ...
- 线程池大小设置,CPU的核心数、线程数的关系和区别,同步与堵塞完全是两码事
线程池应该设置多少线程合适,怎么样估算出来.最近接触到一些相关资料,现作如下总结. 最开始接触线程池的时候,没有想到就仅仅是设置一个线程池的大小居然还有这么多的学问,汗颜啊. 首先,需要考虑到线程池所 ...
- 如何决定 Web 应用的线程池大小
在部署 web 应用到生产环境,或者在对 web 应用进行性能测试的时候,经常会有人问:如何决定 web 应用线程池大小?决定一个 IO 阻塞型 web 应用的线程池大小是一项很艰巨的任务.通常是通过 ...
- 如何计算tomcat线程池大小?
背景 在我们的日常开发中都涉及到使用tomcat做为服务器,但是我们该设置多大的线程池呢?以及根据什么原则来设计这个线程池呢? 接下来,我将介绍本人是怎么设计以及计算的. 目标 确定tomcat服务器 ...
- 转 根据CPU核心数确定线程池并发线程数
转自: https://www.cnblogs.com/dennyzhangdd/p/6909771.html?utm_source=itdadao&utm_medium=referral 目 ...
- 根据CPU核心数确定线程池并发线程数
一.抛出问题 关于如何计算并发线程数,一般分两派,来自两本书,且都是好书,到底哪个是对的?问题追踪后,整理如下: 第一派:<Java Concurrency in Practice>即&l ...
- 根据CPU核心数确定线程池并发线程数(转)
一.抛出问题 关于如何计算并发线程数,一般分两派,来自两本书,且都是好书,到底哪个是对的?问题追踪后,整理如下: 第一派:<Java Concurrency in Practice>即&l ...
- 如何决定Web应用的线程池大小
线程池(Thread Pool)在Web应用中线程池的大小决定了在任何一个时间点应用可以处理请求的并发数.如果一个系统收到的请求数超过了线程池的大小,那么超出的请求要么进入等待队列要么被拒绝.请注意, ...
- spring定时任务ThreadPoolTaskScheduler使用注意事项之线程池大小
背景 最近小伙伴解决了一个工单,描述为"手工推送案件无法推,提示token失效",当前工单状态为待关闭,解决方案为"东软接口不稳定造成的,东软的接口恢复正常后,问题解决& ...
随机推荐
- XmlSerializer 短信备份
package com.itheima.mobileguard.utils; import java.io.File; import java.io.FileNotFoundException; im ...
- SXCPC2018 nucoj2007 和Mengjiji一起攻克难关
problem #include <algorithm> #include <iostream> #include <cstdio> using namespace ...
- 微服务化的不同阶段 Kubernetes 的不同玩法
欢迎访问网易云社区,了解更多网易技术产品运营经验. 作为容器集群管理技术竞争的大赢家,Kubernetes已经和微服务紧密联系,采用Kubernetes的企业往往都开始了微服务架构的探索.然而不同企业 ...
- nodejs、yarn编译安装
yarn和npm一样,是nodejs的一个依赖管理工具 1.安装nodejs 如果缺少c++ compiler 会报错 yum install -y gcc gcc-c++ 安装nodejs V8 ...
- win8中写好的程序,在win7中没办法运行
没有安装相应版本的,net framework win8自带4.0 win7自带2.0 所以4.0及其以上的程序在win7跑必须安装4.0及其以上版本的framework
- @inerface的11条规范写法
总结一些interface声明时的规范,相关宏的介绍,定义方法时有用的修饰符,编写注释的规范,最终写出一个合格的头文件. 1.读写权限 1.1实例变量的@public,@protected,@priv ...
- BZOJ 1083:[SCOI2005]繁忙的都市(最小生成树)
1083: [SCOI2005]繁忙的都市 Description 城市C是一个非常繁忙的大都市,城市中的道路十分的拥挤,于是市长决定对其中的道路进行改造.城市C的道路是这样分布的:城市中有n个交叉路 ...
- 【bzoj1095】[ZJOI2007]Hide 捉迷藏 动态点分治+堆
题目描述 捉迷藏 Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子们决定在家里玩捉迷藏游戏.他们的家很大且构造很奇特,由N个屋子和N-1条双向走廊组成,这 ...
- Redis主从复制简单介绍
由于本地环境的使用,所以搭建一个本地的Redis集群,本篇讲解Redis主从复制集群的搭建,使用的平台是Windows,搭建的思路和Linux上基本一致! (精读阅读本篇可能花费您15分钟,略读需5分 ...
- Java EE 学习(6):IDEA + maven + spring 搭建 web(2)- 配置 Spring
参考:https://my.oschina.net/gaussik/blog/513353 注:此文承接上一文:Java EE 学习(5):IDEA + maven + spring 搭建 web(1 ...