Java多计算量多层循环的解决方案
2019-04-12 本文已影响0人
kevin0016
解决方法:
直接上源码,本例子使用了分治编程,比普通for节省了一半的时间,可以复制运行一下,不用依赖第三方包。86400次循环内嵌套1000000次循环演示。
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;
/**
* @ProjectName: koo-class
* @ClassName: demo
* @Description: TODO
* @Author: liangxuekai
* @CreateDate: 2019-04-12 11:45
* @UpdateUser: liangxuekai
* @UpdateDate: 2019-04-12 11:45
* @@UpdateRemark:: 修改内容
* @Version: 1.0
*/
public class demo {
public static void main(String[] args) throws ExecutionException, InterruptedException {
long begin = System.currentTimeMillis();
int sum = 0;
for (int i = 0; i <= 86400; i++) {
for (int j = 0; j <= 1000000; j++) {
sum += j;
}
}
System.out.println("结果值:" + sum);
System.out.println("消耗时间:" + (System.currentTimeMillis() - begin));
ForkJoinPool pool2 = new ForkJoinPool();
long begin2 = System.currentTimeMillis();
MyRecursiveTask myRecursiveTask = new MyRecursiveTask(0, 86400);
ForkJoinPool pool = new ForkJoinPool();
pool.execute(myRecursiveTask);
System.out.println("结果值:" + myRecursiveTask.get());
pool.shutdown();
System.out.println("消耗时间:" + (System.currentTimeMillis() - begin2));
}
}
MyRecursiveTask方法
import java.util.concurrent.RecursiveTask;
/**
* @ProjectName: koo-class
* @ClassName: MyRecursiveTask
* @Description: TODO
* @Author: liangxuekai
* @CreateDate: 2019-04-12 11:49
* @UpdateUser: liangxuekai
* @UpdateDate: 2019-04-12 11:49
* @@UpdateRemark:: 修改内容
* @Version: 1.0
*/
public class MyRecursiveTask extends RecursiveTask<Integer> {
private int begin;
private int end;
public MyRecursiveTask(int begin, int end) {
super();
this.begin = begin;
this.end = end;
}
@Override
protected Integer compute() {
if ((end - begin) != 0) {
int min = (begin + end) / 2;
MyRecursiveTask myRecursiveTaskLeft = new MyRecursiveTask(begin, min);
MyRecursiveTask myRecursiveTaskRight = new MyRecursiveTask(min + 1, end);
this.invokeAll(myRecursiveTaskLeft, myRecursiveTaskRight);
int left = myRecursiveTaskLeft.join();
int right = myRecursiveTaskRight.join();
return left + right;
} else {
int sum = 0;
for (int j = 0; j <= 1000000; j++) {
sum+=j;
}
return sum;
}
}
}
执行结果对比:
执行消耗时间对比