天天看点

java7并行计算框架Fork/Join

拆分fork+合并join。jdk1.7整合Fork/Join,性能上有大大提升。

思想:充分利用多核CPU把计算拆分成多个子任务,并行计算,提高CPU利用率大大减少运算时间

当你在ForkJoinPool中执行ForkJoinTask时,你可以使用同步或异步方式来实现。当你使用同步方式时,提交任务给池的方法直到提交的任务完成它的执行,才会返回结果。当你使用异步方式时,提交任务给执行者的方法将立即返回,所以这个任务可以继续执行。

你应该意识到这两个方法有很大的区别,当你使用同步方法,调用这些方法(比如:invokeAll()方法)的任务将被阻塞,直到提交给池的任务完成它的执行。这允许ForkJoinPool类使用work-stealing算法,分配一个新的任务给正在执行睡眠任务的工作线程。反之,当你使用异步方法(比如:fork()方法),这个任务将继续它的执行,所以ForkJoinPool类不能使用work-stealing算法来提高应用程序的性能。在这种情况下,只有当你调用join()或get()方法来等待任务的完成时,ForkJoinPool才能使用work-stealing算法。

异步的简单实例如下:

public class ForjoinTest  extends RecursiveTask<Integer> {
    private int start;
    private int end;

    public ForjoinTest(int start, int end) {
        this.start = start;
        this.end = end;
    }

    //计算
    @Override
    protected Integer compute() {
        int sum = ;
        if (start - end < ) {
            for (int i = start; i < end; i++) {
                sum += i;
            }
        } else {//间隔有100则拆分多个任务计算
            int middle = (start + end) / ;
            ForjoinTest left = new ForjoinTest(start, middle);
            ForjoinTest right = new ForjoinTest(middle + , end);
            left.fork();
            right.fork();

            sum = left.join() + right.join();
        }
        return sum;
    }
    public static void main(String[] args) throws InterruptedException, ExecutionException {
         ForkJoinPool forkJoinPool = new ForkJoinPool();//对线程池的扩展
         Future<Integer> result = forkJoinPool.submit(new ForjoinTest(, ));

         System.out.println(result.get());

         forkJoinPool.shutdown();
    }