欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

学习java7的fork/join 博客分类: java语言 java7

程序员文章站 2024-02-16 19:33:40
...
在网上看到一个列子,顺便敲了一边,练练手

* ForkJoinPool是一个Excutor的子类
* ForkJoinTask:我们要使用ForkJoin框架,必须首先创建一个ForkJoin任务。它提供在任务中执行fork()和join()操作的机制,通常情况下我们不需要直接继承ForkJoinTask类,而只需要继承它的子类,Fork/Join框架提供了以下两个子类:
RecursiveAction:用于没有返回结果的任务。
RecursiveTask :用于有返回结果的任务。

class CountTask extends RecursiveTask<Integer>{
    private int THRESHOLD = 2;
    private int start ;
    private int end;

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

    @Override
    protected Integer compute() {
        int sum = 0;
        boolean canFork = end-start>THRESHOLD;
        if(!canFork){
            for(int i=start;i<=end;i++){
                sum += i;
            }
        }else{
            int middle = (end-start)/2;
            CountTask task1 = new CountTask(start,middle);
            CountTask task2 = new CountTask(middle+1,end);
            task1.fork();
            task2.fork();
            sum = task1.join() + task1.join();
            /**
             * getException方法返回Throwable对象,
             * 如果任务被取消了则返回CancellationException。
             * 如果任务没有完成或者没有抛出异常则返回null
             */
            if(task1.isCompletedAbnormally())
            {
                System.out.println(task1.getException());
            }
            if(task2.isCompletedAbnormally())
            {
                System.out.println(task2.getException());
            }
        }
        return sum;
    }

    public static void main(String[] args){
        CountTask task = new CountTask(1,10000);
        ForkJoinPool pool = new ForkJoinPool();
        Future<Integer> sum = pool.submit(task);
        println(sum.get());
    }
}
相关标签: java7