根据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失效",当前工单状态为待关闭,解决方案为"东软接口不稳定造成的,东软的接口恢复正常后,问题解决& ...
随机推荐
- python 闯关之路四(下)(并发编程与数据库编程) 并发编程重点
python 闯关之路四(下)(并发编程与数据库编程) 并发编程重点: 1 2 3 4 5 6 7 并发编程:线程.进程.队列.IO多路模型 操作系统工作原理介绍.线程.进程演化史.特点.区别 ...
- POJ1741 Tree (点分治)
Tree Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 25772 Accepted: 8566 Description ...
- Android开发环境安装经验
前段时间在一个安装论坛上,下载了老罗的Android学习视频,看到第三节就卡住了。我这边Eclipse安装SDK总是不成功,报各种错误。断断续续好几天的摸索,终于弄明白了。 首先要安装ADT插件,也就 ...
- mate viewport
<meta name="viewport" content="width=device-width,height=device-height,initial-sca ...
- 数据结构设计 Stack Queue
之前在简书上初步总结过几个有关栈和队列的数据结构设计的题目.http://www.jianshu.com/p/d43f93661631 1.线性数据结构 Array Stack Queue Hash ...
- LeetCode with Python -> Linked List
21. Merge Two Sorted Lists Merge two sorted linked lists and return it as a new list. The new list s ...
- kvm配置虚拟机[待整理]
working note 4-12-2016 1,利用libvirt图形虚拟机管理工具virt-manager搭建虚拟机,通过存储池(storage pool )和卷(volume)存放虚拟机镜像(I ...
- POJ 3321:Apple Tree(dfs序+树状数组)
题目大意:对树进行m次操作,有两类操作,一种是改变一个点的权值(将0变为1,1变为0),另一种为查询以x为根节点的子树点权值之和,开始时所有点权值为1. 分析: 对树进行dfs,将树变为序列,记录每个 ...
- 【SPOJ1297】Palindrome (SA+RMQ)
求最长回文串.把原串翻转后,加在原串后面,中间插入一个辨别字符.然后求SA,Height.然后枚举每个字母作为回文串中心,分长度为奇数和偶数去讨论:奇数求 suffix(i)和suffix(n-i+1 ...
- [NOI2014][bzoj3670] 动物园 [kmp+next数组应用]
题面 传送门 思路 首先,这题最好的一个地方,在于它给出的关于$next$的讲解实在是妙极......甚至可以说我的kmp是过了这道题以后才脱胎换骨的 然后是正文: 如何求$num$数组? 这道题的输 ...