Java多线程--Fork/Join线程

For/Join框架,案例摘自《Java并发编程的艺术》

public class CountTask extends RecursiveTask<Integer> {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    private static final int THRESHOLD = 2;

    private int begin;

    private int end;

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

    @Override
    protected Integer compute() {
        int sum = 0;

        // 如果任务比较小
        boolean canCompute = (this.end - this.begin) <= THRESHOLD;
        if (canCompute) {
            for (int i = this.begin; i <= end; i++) {
                sum += i;
            }
        } else {
            int middle = (end - begin) / 2;
            CountTask leftTask = new CountTask(this.begin, middle);
            CountTask rightTask = new CountTask(middle + 1, this.end);
            leftTask.fork();
            rightTask.fork();

            int leftResult = leftTask.join();
            int rightResult = rightTask.join();
            sum = leftResult + rightResult;
        }
        return sum;
    }

    public static void main(String[] args) {
        ForkJoinPool forkJoinPool=new ForkJoinPool();

        CountTask task=new CountTask(1,4);

        try {
            ForkJoinTask<Integer> result = forkJoinPool.submit(task);
            System.out.println(result.get());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }
}

猜你喜欢

转载自blog.csdn.net/BtWangZhi/article/details/82696078