使用线程池测试cpu的并发计算能力
接到一个需求是测试一下cpu并发计算能力,针对int和float求和单位时间能执行几次的问题。可能是服务器选型用到的参数。
开始使用的是fork-join,但是发现fork-join每次得到的结果值波动很明显不稳定(可能和fork-join的实现有关系,抽空研究一下),所以用了线程池的思路来实现
ps:
当然你可以把这篇文章作为线程池和Callable结合并发计算的一个demo来看
代码如下:
package com.company; import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit; /**
* @author nf
* 多线程累加求和
*
*/
public class CpuTestByThreadPool{
private ThreadPoolExecutor pool = null;
public void init(int poolCount) {
pool = new ThreadPoolExecutor(
poolCount,
poolCount*2,
30,
TimeUnit.MINUTES,
new ArrayBlockingQueue<Runnable>(10));
}
public void destory() {
if(pool != null) {
pool.shutdownNow();
}
}
private class Sum implements Callable<Integer>{
private int subMin;
private int subMax;
private int[] arr;
public Sum(int subMin,int subMax,int[] arr){
this.subMin = subMin;
this.subMax = subMax;
this.arr = arr;
}
@Override
public Integer call() throws Exception {
int sum = 0;
for(int i = subMin;i <= subMax;i++){
sum += arr[i];
}
return sum;
}
} /**
* 求和范围是 min ~ max
* @param min
* @param max
* @param threadNum
* @return
*/
public Integer getSum(int min, int max,int[] arr, int threadNum){
int subMin;
int subMax;
List<FutureTask<Integer>> taskList = new ArrayList<>();
int sumCounts = max - min;
int subCounts = sumCounts/threadNum;
int remainder = sumCounts%threadNum;
int mark = min;
for(int i = 0;i<threadNum;i++){
subMin = mark;
if(remainder!=0&&remainder>i){
subMax = subMin + subCounts;
}else{
subMax = mark + subCounts - 1;
}
mark = subMax + 1;
FutureTask<Integer> task = new FutureTask<Integer>(new Sum(subMin,subMax,arr));
taskList.add(task);
pool.execute(new Thread(task));
}
int sum = taskListSum(taskList);
return sum;
} private Integer taskListSum(List<FutureTask<Integer>> taskList){
int sum = 0;
for(FutureTask<Integer> task : taskList){
try {
sum += task.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
return sum;
} private class SumFloat implements Callable<Float>{
private int subMin;
private int subMax;
private Float[] arr;
public SumFloat(int subMin,int subMax,Float[] arr){
this.subMin = subMin;
this.subMax = subMax;
this.arr = arr;
}
@Override
public Float call() throws Exception {
Float sum = 0f;
for(int i = subMin;i <= subMax;i++){
sum += arr[i];
}
return sum;
}
} /**
* 求和范围是 min ~ max
* @param min
* @param max
* @param threadNum
* @return
*/
public Float getSumFloat(int min, int max,Float[] arr, int threadNum){
int subMin;
int subMax;
List<FutureTask<Float>> taskList = new ArrayList<>();
int sumCounts = max - min;
int subCounts = sumCounts/threadNum;
int remainder = sumCounts%threadNum;
int mark = min;
for(int i = 0;i<threadNum;i++){
subMin = mark;
if(remainder!=0&&remainder>i){
subMax = subMin + subCounts;
}else{
subMax = mark + subCounts - 1;
}
mark = subMax + 1;
FutureTask<Float> task = new FutureTask<Float>(new SumFloat(subMin,subMax,arr));
taskList.add(task);
pool.execute(new Thread(task));
}
Float sum = taskListSumFloat(taskList);
return sum;
} private Float taskListSumFloat(List<FutureTask<Float>> taskList){
Float sum = 0f;
for(FutureTask<Float> task : taskList){
try {
sum += task.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
return sum;
} /**
* @param args
* 测试
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException{
//修改这三个参数
final int arrSize = 2800000,sleeptime=10000;
final int poolCount = 10;
int[] arr = new int[arrSize];
for (int i = 0; i < arrSize; i++) {
arr[i] = i + 1;
} Float[] arrFloat = new Float[arrSize];
for (int i = 0; i < arrSize; i++) {
arrFloat[i] = i + (((float)i) / 3f);
}
CpuTestByThreadPool sumCalculator = new CpuTestByThreadPool(); sumCalculator.init(poolCount);
long startTime = 0L;
long endTime = 0L;
long countL=0L,countF=0L;
startTime = System.nanoTime();
while ((endTime-startTime)<10000000000L) {//10秒
sumCalculator.getSum(0, arrSize,arr, poolCount);
endTime = System.nanoTime();
countL++;
}
System.out.println(countL);
Thread.sleep(sleeptime);
endTime = 0L;
startTime = System.nanoTime();
while ((endTime-startTime)<10000000000L) {
sumCalculator.getSumFloat(0, arrSize, arrFloat, poolCount);
endTime = System.nanoTime();
countF++;
}
System.out.println(countF);
sumCalculator.destory(); System.out.println("TPCC= " + (countL+countF)/2 + "tpmC");
} }
可以通过修改arrSize = 2800000;poolCount = 10;这两个参数匹配自己的机器(让运行时cpu内核占满就行了)
使用线程池测试cpu的并发计算能力的更多相关文章
- [原创] JAVA 递归线程池测试 ExecutorService / ForkJoinPool
测试工具使用递归的方式获取子进程的Msg消息,目前有2种常用的ExecutorService / ForkJoinPool 为了测试哪种效果较好,我们来写个测试Demo,循环5555555次+1(加锁 ...
- JAVA 递归线程池测试 ExecutorService / ForkJoinPool
测试工具使用递归的方式获取子进程的Msg消息,目前有2种常用的ExecutorService / ForkJoinPool 为了测试哪种效果较好,我们来写个测试Demo,循环5555555次+1(加锁 ...
- 【重学Java】多线程进阶(线程池、原子性、并发工具类)
线程池 线程状态介绍 当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态.线程对象在不同的时期有不同的状态.那么Java中的线程存在哪几种状态呢?Java中的线程 状态被定 ...
- javaWeb 使用线程池+队列解决"订单并发"问题
解决方式:使用线程池+队列 项目基于Spring,如果不用spring需要自己把 ThreadPoolManager.java 改成单例模式 1.写一个Controller(Spring mvc) / ...
- 线程池大小 & cpu core
http://stackoverflow.com/questions/14556037/number-of-processor-core-vs-the-size-of-a-thread-pool ht ...
- Java并发(二十一):线程池实现原理
一.总览 线程池类ThreadPoolExecutor的相关类需要先了解: (图片来自:https://javadoop.com/post/java-thread-pool#%E6%80%BB%E8% ...
- python 之 线程池实现并发
使用线程池实现高IO并发 模块:ThreadPoolExecutor, as_completed 测试代码如下: #!/opt/python3/bin/python3 from concurrent. ...
- 并发编程(六)--进程/线程池、协程、gevent第三方库
一.进程/线程池 1.进程池 (1)什么是进程池 如果需要创建的子进程数量不大,可以直接利用multiprocess中的Process来创建.但是当需要创建上百个或上千个,手动创建就较为繁琐,这时就可 ...
- 并发编程(六)——进程/线程池、协程、gevent第三方库
进程/线程池.协程.gevent第三方库 一.进程/线程池 1.进程池 (1)什么是进程池 如果需要创建的子进程数量不大,可以直接利用multiprocess中的Process来创建.但是当需要创建上 ...
随机推荐
- PAT T1013 Image Segmentation
krustral算法加并查集,按题给要求维护并查集~ #include<bits/stdc++.h> using namespace std; ; const int inf=1e9; i ...
- [转]BeanUtil使用
BeanUtils的使用 转载自:https://blog.csdn.net/xxf159797/article/details/53645722 1.commons-beanutils的介绍 com ...
- Android开发之显示分辨率及单位
Android 各种屏幕分辨率: VGA: Video Graphics Array,即:显示绘图矩阵,相当于640×480 像素: HVGA: Half-size VGA ...
- LDAP-轻量级目录访问协议(统一认证)
概念 LDAP是轻量目录访问协议,英文全称是Lightweight Directory Access Protocol,一般都简称为LDAP. 参考资料 LDAP概念和原理介绍 我花了一个五一终于搞懂 ...
- spring boot 中 Cache 的使用
参考:https://blog.csdn.net/qq_38974634/article/details/80650810 一.JSR107 Java Caching 定义5个核心的接口,分别是Cac ...
- iOS学习7:iOS沙盒(sandBox)机制(一)之获取沙盒路径及目录说明(转)
转:http://my.oschina.net/joanfen/blog/151145 一.iOS沙盒机制 iOS的应用只能访问为该应用创建的区域,不可访问其他区域,应用的其他非代码文件都存在此目录下 ...
- Linux centosVMware NFS介绍、NFS服务端安装配置、NFS配置选项
一.NFS介绍 NFS是Network File System的缩写 NFS最早由Sun公司开发,分2,3,4三个版本,2和3由Sun起草开发,4.0开始Netapp公司参与并主导开发,最新为4.1版 ...
- Linux centos7 Linux网络相关、firewalld和netfilter、netfilter5表5链介绍、iptables语法
一. Linux网络相关 yum install net-tools ifconfig查看网卡ip ifup ens33开启网卡 ifdown ens33关闭网卡 设定虚拟网卡ens33:0 mii- ...
- 如何让tomcat加载项目变快
修改配置: VM options填写内容: -Xms128m -Xmx256m -XX:PermSize=128m -XX:MaxPermSize=256m` 图示: ##1: ##2:
- Day11 - I - 取石子游戏 HDU - 2516
1堆石子有n个,两人轮流取.先取者第1次可以取任意多个,但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍.取完者胜.先取者负输出"Second win".先取者胜输出&q ...