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