一般来说池中总线程数是核心池线程数量两倍,只要确保当核心池有线程停止时,核心池外能有线程进入核心池即可。

我们所需要关心的主要是核心池线程的数量该如何设置。

自定义线程池代码

  1. package com.lc.concurrent;
  2. import java.util.concurrent.ArrayBlockingQueue;
  3. import java.util.concurrent.ThreadPoolExecutor;
  4. import java.util.concurrent.TimeUnit;
  5.  
  6. public class MyThreadPoolExecutor {
  7. //最大可用的CPU核数
  8. public static final int PROCESSORS=Runtime.getRuntime().availableProcessors();
  9. //线程最大的空闲存活时间,单位为秒
  10. public static final int KEEPALIVETIME=60;
  11. //任务缓存队列长度
  12. public static final int BLOCKINGQUEUE_LENGTH=500;
  13.  
  14. public ThreadPoolExecutor createThreadPool(){
  15. return new ThreadPoolExecutor(PROCESSORS * 2,PROCESSORS * 4,KEEPALIVETIME,TimeUnit.SECONDS,
  16. new ArrayBlockingQueue<Runnable>(BLOCKINGQUEUE_LENGTH));
  17. }
  18. }

线程中的任务最终是交给CPU的线程去处理的,而CPU可同时处理线程数量大部分是CPU核数的两倍,运行环境中CPU

的核数我们可以通过Runtime.getRuntime().availableProcessors()这个方法而获取。理论上来说核心池线程数量应该为

Runtime.getRuntime().availableProcessors()*2,那么结果是否符合我们的预期呢,可以来测试一下(本次测试测试的

是I/O密集型任务,事实上大部分的任务都是I/O密集型的,即大部分任务消耗集中在的输入输出。而CPU密集型任务主

要消耗CPU资源进行计算,当任务为CPU密集型时,核心池线程数设置为CPU核数+1即可)

  1. package com.lc.concurrent;
  2.  
  3. import java.util.Arrays;
  4. import java.util.Random;
  5. import java.util.concurrent.ThreadPoolExecutor;
  6.  
  7. public class CreateThreads {
  8. public synchronized static void main(String[] args) {
  9. System.out.println(MyThreadPoolExecutor.PROCESSORS);
  10. new CreateThreads().test();
  11. }
  12.  
  13. public synchronized void test(){
  14. ThreadPoolExecutor threadPoolExecutor=new MyThreadPoolExecutor().createThreadPool();
  15. for (int i = 0; i <= 100; i++) {
  16. MyTask myTask = new MyTask(i);
  17. threadPoolExecutor.execute(myTask);
  18. }
  19. threadPoolExecutor.shutdown();
  20. }
  21. }
  22.  
  23. class MyTask implements Runnable{
  24. private int i;
  25.  
  26. public MyTask(int i){
  27. this.i=i;
  28. }
  29.  
  30. @Override
  31. public void run() {
  32. System.out.println("任务"+i+"开始执行"+System.currentTimeMillis());
  33. for (int i=0;i<32766;i++){
  34. Random random=new Random();
  35. int randNum=random.nextInt();
  36. int[] a={1,2,3,4,5,6,9,18,290,238,991,100,19,1932,randNum};
  37. Arrays.sort(a);
  38. Arrays.hashCode(a);
  39. Arrays.stream(a);
  40. }
  41. System.out.println("任务"+i+"结束执行"+System.currentTimeMillis());
  42. }
  43. }

本机CPU核数为4,可同时处理8线程,测试结果如下:

  1. 核心池线程数量 执行耗时(毫秒,多次测试结果以/间隔)
  2. 4 474/479/471
  3. 8 430/436/421
  4. 12 432/425/438
  5. 16 437/431/449
  6. 20 471/481/469

可以发现当线程数量小于CPU核数两倍时速度明显较慢,超过两倍后速度差不多,当核心池数量过多时,速度又会显著下降

由此可以看出,核心池线程数量大小应在CPU核数两倍以上且不宜过多。

所以说,将线程池的核心池线程数量配置为CPU核数的两倍是比较合适的。

  1.  

根据CPU核数合理设置线程池大小的更多相关文章

  1. Java-如何合理的设置线程池大小

    想要合理配置线程池线程数的大小,需要分析任务的类型,任务类型不同,线程池大小配置也不同. 配置线程池的大小可根据以下几个维度进行分析来配置合理的线程数: 任务性质可分为:CPU密集型任务,IO密集型任 ...

  2. 线程池大小设置,CPU的核心数、线程数的关系和区别,同步与堵塞完全是两码事

    线程池应该设置多少线程合适,怎么样估算出来.最近接触到一些相关资料,现作如下总结. 最开始接触线程池的时候,没有想到就仅仅是设置一个线程池的大小居然还有这么多的学问,汗颜啊. 首先,需要考虑到线程池所 ...

  3. 如何决定 Web 应用的线程池大小

    在部署 web 应用到生产环境,或者在对 web 应用进行性能测试的时候,经常会有人问:如何决定 web 应用线程池大小?决定一个 IO 阻塞型 web 应用的线程池大小是一项很艰巨的任务.通常是通过 ...

  4. 如何计算tomcat线程池大小?

    背景 在我们的日常开发中都涉及到使用tomcat做为服务器,但是我们该设置多大的线程池呢?以及根据什么原则来设计这个线程池呢? 接下来,我将介绍本人是怎么设计以及计算的. 目标 确定tomcat服务器 ...

  5. 转 根据CPU核心数确定线程池并发线程数

    转自: https://www.cnblogs.com/dennyzhangdd/p/6909771.html?utm_source=itdadao&utm_medium=referral 目 ...

  6. 根据CPU核心数确定线程池并发线程数

    一.抛出问题 关于如何计算并发线程数,一般分两派,来自两本书,且都是好书,到底哪个是对的?问题追踪后,整理如下: 第一派:<Java Concurrency in Practice>即&l ...

  7. 根据CPU核心数确定线程池并发线程数(转)

    一.抛出问题 关于如何计算并发线程数,一般分两派,来自两本书,且都是好书,到底哪个是对的?问题追踪后,整理如下: 第一派:<Java Concurrency in Practice>即&l ...

  8. 如何决定Web应用的线程池大小

    线程池(Thread Pool)在Web应用中线程池的大小决定了在任何一个时间点应用可以处理请求的并发数.如果一个系统收到的请求数超过了线程池的大小,那么超出的请求要么进入等待队列要么被拒绝.请注意, ...

  9. spring定时任务ThreadPoolTaskScheduler使用注意事项之线程池大小

    背景 最近小伙伴解决了一个工单,描述为"手工推送案件无法推,提示token失效",当前工单状态为待关闭,解决方案为"东软接口不稳定造成的,东软的接口恢复正常后,问题解决& ...

随机推荐

  1. C# datagridview列绑定类中类的属性

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://www.cnblogs.com/linghaoxinpian/p/5906374. ...

  2. [网站公告]又拍云API故障造成图片无法上传(已恢复)

    大家好,18:00左右开始,又拍云API出现故障,调用图片上传API时出现错误:“The remote server returned an error: (403) Forbidden.”,造成图片 ...

  3. 设计模式之第17章-备忘录模式(Java实现)

    设计模式之第17章-备忘录模式(Java实现) 好男人就是我,我就是曾小贤.最近陈赫和张子萱事件闹得那是一个沸沸扬扬.想想曾经每年都有爱情公寓陪伴的我现如今过年没有了爱情公寓总是感觉缺少点什么.不知道 ...

  4. thinkphp3.2接入支付宝支付接口(PC端)

    下载支付宝接口包    点击这里        提取密码:aryp 整个接口核心类文件 alipay.config.php是相关参数的配置文件 alipayapi.php 是支付宝接口入口文件 not ...

  5. Leetcode 558.四叉树交集

    四叉树交集 四叉树是一种树数据,其中每个结点恰好有四个子结点:topLeft.topRight.bottomLeft 和 bottomRight.四叉树通常被用来划分一个二维空间,递归地将其细分为四个 ...

  6. PAT1039

    小红想买些珠子做一串自己喜欢的珠串.卖珠子的摊主有很多串五颜六色的珠串,但是不肯把任何一串拆散了卖.于是小红要你帮忙判断一下,某串珠子里是否包含了全部自己想要的珠子?如果是,那么告诉她有多少多余的珠子 ...

  7. Linux性能分析调优工具介绍

    1.常用性能分析工具 1)CPU性能分析工具 vmstat ps sar time strace pstree top 2)Memory性能分析工具 vmstat strace top ipcs ip ...

  8. BZOJ 1083:[SCOI2005]繁忙的都市(最小生成树)

    1083: [SCOI2005]繁忙的都市 Description 城市C是一个非常繁忙的大都市,城市中的道路十分的拥挤,于是市长决定对其中的道路进行改造.城市C的道路是这样分布的:城市中有n个交叉路 ...

  9. linux下编译lua库

    编辑MakeFile INSTALL_TOP= /usr/local修改为目标install位置 执行 make linux make install 如果提示依赖libreadline  可以直接a ...

  10. 挖煤(coal)

    挖煤(coal) solution 我好弱,啥也想不到. 想了很久dp,这有后效性啊. 结果倒着做就可以了,因为后面的不会影响前面的. 考虑前面的影响后面:挖煤相当于让后面所有a[I]*(1+k%) ...