java中测试计算能力_使用线程池测试cpu的并发计算能力

packagecom.company;importjava.util.ArrayList;importjava.util.List;importjava.util.concurrent.ArrayBlockingQueue;importjava.util.concurrent.Callable;importjava.util.concurrent.ExecutionException;importjava.util.concurrent.FutureTask;importjava.util.concurrent.ThreadPoolExecutor;importjava.util.concurrent.TimeUnit;/***@authornf

* 多线程累加求和

**/

public classCpuTestByThreadPool{private ThreadPoolExecutor pool = null;public void init(intpoolCount) {

pool= newThreadPoolExecutor(

poolCount,

poolCount*2,30,

TimeUnit.MINUTES,new ArrayBlockingQueue(10));

}public voiddestory() {if(pool != null) {

pool.shutdownNow();

}

}private class Sum implements Callable{private intsubMin;private intsubMax;private int[] arr;public Sum(int subMin,int subMax,int[] arr){this.subMin =subMin;this.subMax =subMax;this.arr =arr;

}

@Overridepublic Integer call() throwsException {int sum = 0;for(int i = subMin;i <= subMax;i++){

sum+=arr[i];

}returnsum;

}

}/*** 求和范围是 min ~ max

*@parammin

*@parammax

*@paramthreadNum

*@return

*/

public Integer getSum(int min, int max,int[] arr, intthreadNum){intsubMin;intsubMax;

List> taskList = new ArrayList<>();int sumCounts = max -min;int subCounts = sumCounts/threadNum;int remainder = sumCounts%threadNum;int mark =min;for(int i = 0;i

subMin=mark;if(remainder!=0&&remainder>i){

subMax= subMin +subCounts;

}else{

subMax= mark + subCounts - 1;

}

mark= subMax + 1;

FutureTask task = new FutureTask(newSum(subMin,subMax,arr));

taskList.add(task);

pool.execute(newThread(task));

}int sum =taskListSum(taskList);returnsum;

}private Integer taskListSum(List>taskList){int sum = 0;for(FutureTasktask : taskList){try{

sum+=task.get();

}catch(InterruptedException e) {

e.printStackTrace();

}catch(ExecutionException e) {

e.printStackTrace();

}

}returnsum;

}private class SumFloat implements Callable{private intsubMin;private intsubMax;privateFloat[] arr;public SumFloat(int subMin,intsubMax,Float[] arr){this.subMin =subMin;this.subMax =subMax;this.arr =arr;

}

@Overridepublic Float call() throwsException {

Float sum=0f;for(int i = subMin;i <= subMax;i++){

sum+=arr[i];

}returnsum;

}

}/*** 求和范围是 min ~ max

*@parammin

*@parammax

*@paramthreadNum

*@return

*/

public Float getSumFloat(int min, int max,Float[] arr, intthreadNum){intsubMin;intsubMax;

List> taskList = new ArrayList<>();int sumCounts = max -min;int subCounts = sumCounts/threadNum;int remainder = sumCounts%threadNum;int mark =min;for(int i = 0;i

subMin=mark;if(remainder!=0&&remainder>i){

subMax= subMin +subCounts;

}else{

subMax= mark + subCounts - 1;

}

mark= subMax + 1;

FutureTask task = new FutureTask(newSumFloat(subMin,subMax,arr));

taskList.add(task);

pool.execute(newThread(task));

}

Float sum=taskListSumFloat(taskList);returnsum;

}private Float taskListSumFloat(List>taskList){

Float sum=0f;for(FutureTasktask : taskList){try{

sum+=task.get();

}catch(InterruptedException e) {

e.printStackTrace();

}catch(ExecutionException e) {

e.printStackTrace();

}

}returnsum;

}/***@paramargs

* 测试

*@throwsInterruptedException*/

public static void main(String[] args) throwsInterruptedException{//修改这三个参数

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= newFloat[arrSize];for (int i = 0; i < arrSize; i++) {

arrFloat[i]= i + (((float)i) /3f);

}

CpuTestByThreadPool sumCalculator= newCpuTestByThreadPool();

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");

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值