java并发工具包-ForkJoin

1. RecursiveTask: 有返回值的ForkJoin;需要估算多大的“划分值”合适。否则,可能导致花费的时间和资源较大。

public class ForkJoinRecursiveTask {

    private static final int MAX_THREAD_HOLED = 200;

    public static void main(String[] args) throws ExecutionException, InterruptedException {        
    	final int MAX_NUMBER = 1000;
        final ForkJoinPool forkJoinPool = new ForkJoinPool();
        MyRecursiveTask recursiveTask = new MyRecursiveTask(1, MAX_NUMBER);
        ForkJoinTask<Long> task = forkJoinPool.submit(recursiveTask);

        Long sum = task.get();
        System.out.println("sum: " + sum);
    }
    static class MyRecursiveTask extends RecursiveTask<Long> {

        private final int start;

        private final int end;

        public MyRecursiveTask(int start, int end) {            
        	this.start = start;
            this.end = end;
        }
        
        @Override
        protected Long compute() {            
        	if ((end - start) <= MAX_THREAD_HOLED) {
                return (long) IntStream.rangeClosed(start, end).sum();
            } else {                
            	int middle = (end + start) / 2;
                MyRecursiveTask leftTask = new MyRecursiveTask(start, middle);
                MyRecursiveTask rightTask = new MyRecursiveTask(middle + 1, end);

                leftTask.fork();
                rightTask.fork();

                return leftTask.join() + rightTask.join();
            }        
        }
    }
}

2. RecursiveAction 无返回值的ForkJoin.

public class ForkJoinRecursiveAction {

    private static final int MAX_THREAD_HOLED = 200;

    private static AtomicLong sum = new AtomicLong(0);

    public static void main(String[] args) throws InterruptedException {        
    	final int MAX_NUMBER = 1000;
        final ForkJoinPool forkJoinPool = new ForkJoinPool();
        MyRecursiveAction recursiveAction = new MyRecursiveAction(1, MAX_NUMBER);
        forkJoinPool.submit(recursiveAction);

        // 因为是Action, 无法获取到最后的数据; 需要设置等待时间, 获取数据.
        forkJoinPool.awaitTermination(2, TimeUnit.SECONDS);
        System.out.println("SUM: " + sum.get());
    }
    static class MyRecursiveAction extends RecursiveAction {

        private final int start;

        private final int end;

        public MyRecursiveAction(int start, int end) {           
        	this.start = start;
            this.end = end;
        }
        
        @Override
        protected void compute() {            
        	if ((end - start) <= MAX_THREAD_HOLED) {
                sum.addAndGet(IntStream.rangeClosed(start, end).sum());
            } else {                
            	int middle = (end + start) / 2;
                MyRecursiveAction leftTask = new MyRecursiveAction(start, middle);
                MyRecursiveAction rightTask = new MyRecursiveAction(middle + 1, end);

                leftTask.fork();
                rightTask.fork();
            }        
         }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值