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

执行结果对比:


执行消耗时间对比
上一篇 下一篇

猜你喜欢

热点阅读