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

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

自定义线程池代码

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;}@Overridepublic 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/4718                   430/436/42112                  432/425/43816                  437/431/44920                  471/481/469

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

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

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


转载于:https://www.cnblogs.com/coder-lichao/p/10931919.html

根据CPU核数合理设置线程池大小相关推荐

  1. java线程池大小_线程池大小设置多少合适?java如何合理设置线程池大小?

    在连接数据库时我们经常会用到线程池,而有时候我们就会烦恼,线程池的大小究竟该设置成多大才合适呢?小伙伴们知道要如何合理设置线程池大小吗?下面跟小编一起来看看吧. 一般来说,我们线程池究竟设置多大是基于 ...

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

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

  3. Java线程池的使用(合理设置线程池的大小)

    线程池工具类 import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; im ...

  4. 线程池大小选择:针对 I/O 密集型场景和 CPU 密集型场景

    线程池大小选择:针对 I/O 密集型场景和 CPU 密集型场景 I/O 密集型场景 CPU密集型场景 线程池大小选择 线程池在 I/O 密集型场景的必要性 线程池在 CPU 密集型场景的必要性 线程池 ...

  5. 线程池大小设置和CPU核心数的关系

    文章目录 1.线程池和CPU核心数的关系 2.常见概念:CPU的核心数,CPU的线程数 3.是否使用线程池就一定比使用单线程高效呢? 1.线程池和CPU核心数的关系 一般说来,大家认为线程池的大小经验 ...

  6. python3 ThreadPoolExecutor 线程池大小设置

    线程池的理想大小取决于被提交任务的类型以及所部署系统的特性.线程池应该避免设置的过大或过小,如果线程池过大,大量的线程将在相对很少的CPU和内存资源上发生竞争,这不仅会导致更高的内存使用量,而且还可能 ...

  7. 从原理上搞懂如何设置线程池参数大小?

    我们在使用线程池的时候,会有两个疑问点: 线程池的线程数量设置过多会导致线程竞争激烈 如果线程数量设置过少的话,还会导致系统无法充分利用计算机资源 那么如何设置才不会影响系统性能呢? 其实线程池的设置 ...

  8. mysql 线程池大小设置_MySQL线程池参数解析

    线程池是数据库系统非常重要功能,然而MySQL社区版并不包含线程池功能,不过好在MySQL的Percona发行版本提供了这个功能,除此之外,MySQL的企业版也提供线程池,从性价比上说,Percona ...

  9. 【Pytorch】物理cpu、逻辑cpu、cpu核数、pytorch线程数设置

    上周末写ddp,常常遇到中途退出的问题,解决中途遇到了很多CPU线程数和核心数的问题,记录如下 1. 物理cpu.逻辑cpu.cpu核数.超线程 这一部分主要来自什么是物理cpu,什么是逻辑cpu,什 ...

最新文章

  1. javaScript常用知识点有哪些
  2. pytorch实现人脸表情识别
  3. SQL 查询总是先执行SELECT语句吗?你们都错了!
  4. C++中类和对象的一些注意事项 --- 多态
  5. 如何做一个国产数据库(六) 网络传输 nodejs做测试客户端
  6. 突然想起今天的博客汇报没写
  7. 支持WI-FI的blackberry
  8. 批量数据插入(Java读取Excel文件并使用mybatis写入MySQL数据库)(含免费源码下载)
  9. wincc怎么做一个弹出画面_Wincc如何利用单个弹出窗口画面的模板,来实现调用多组画面参数?...
  10. 计算机网络应用基础试题6,计算机网络应用基础期末试卷试题2
  11. 会说话的PPT,从开发者角度十分钟理解区块链
  12. 时尚圈美女撰文主攻方向
  13. WordCloud词云图生成_示例
  14. 二极管(三):电源防反接
  15. English Learning - Day20 作业打卡 2022.12.26 周一
  16. matlab 滤波器篇
  17. 回归系数(拟合度)与相关系数
  18. FFmpeg封装ADTS为MP4
  19. 前端中的icon几种用法
  20. SDNUOJ 1614.阿哲的幻想国(练习vector的用法)

热门文章

  1. 【原创】linux命令bc使用详解
  2. UIPopoverController在ARC环境下用法注意
  3. usaco Cowxor (trie 树)
  4. 北京计算机学院 肖战,Shuai Li
  5. pygame是python的一个库吗,python学习pygame,,基本库导入impor
  6. Linux导入ora-39070,impdp 导入数据报ORA-39002,ORA-39070,ORA-39002, ORA-39087
  7. python成绩统计_python学习-统计学生成绩-统计学生成绩
  8. jquery ajax统一对url编码,jQuery AJAX请求中的相对与绝对URL
  9. 织梦生成html加速,加快DEDECMS静态html网页生成速度的方法
  10. apache 安装后默认主页无法打开_CAD教程:CAD软件打开图纸后钢筋符号无法读取的解决办法...