java線程--分治法fork()

分治法fork()

public class Test {

    public static final int THRESHOLD = 10;

    static class CountTask extends RecursiveTask<Long> {

        private static final long serialVersionUID = 5858564021273368011L;
        private long start;
        private long end;

        public CountTask(long start, long end) {
            System.out.println(start+" "+end);
            this.start = start;
            this.end = end;
        }

        @Override
        protected Long compute() {
            long sum = 0;
            boolean canCompute = (end - start) <= THRESHOLD;
            if (canCompute) {
                for (long i = start; i <= end; i++) {
                    sum += i;
                }
            } else {
                long step = (start + end) / THRESHOLD;
                ArrayList<CountTask> subTasks = new ArrayList<>();
                long pos = 0;
                for (int i = 0; i < step+1; i++) {
                    pos = start+ step*i;
                    long lastOne = pos + step-1;
                    if (lastOne > end)
                        lastOne = end;
                    CountTask subTask = new CountTask(pos, lastOne);
                    subTasks.add(subTask);
                    subTask.fork();
                }
                for (CountTask t : subTasks) {
                    sum += t.join();
                }
            }
            return sum;
        }

    }

    public static void main(String[] args) throws InterruptedException, ExecutionException {

        ForkJoinPool pool=new ForkJoinPool();
        CountTask t =new CountTask(0,100L);
        ForkJoinTask<Long> result = pool.submit(t);
        System.out.println(result.get());
    }

}
相關文章
相關標籤/搜索