码迷,mamicode.com
首页 > 编程语言 > 详细

fork-join(多线程),主线程-分线程-主线程,通知返回

时间:2016-08-09 11:59:20      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:

发烧友 21:58:01
import java.util.Date;
import java.util.concurrent.RecursiveTask;

public class TstForkJoin {

    public static void main(String args[]) {
        new TstForkJoin().start();
    }

    private void start() {
        /*ForkJoinPool forkJoinPool = new ForkJoinPool();
        Future<Integer> result = forkJoinPool.submit(new Calculator(0, 10000));
        try {
            System.out.print(result.get());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }*/
        System.out.println(new Date());
        TstFJ1 tstFJ1 = new TstFJ1(4000);
        TstFJ2 tstFJ2 = new TstFJ2(7000);
        tstFJ1.fork();
        tstFJ2.fork();
        System.out.println(new Date());
        Integer sum = tstFJ1.join() + tstFJ2.join();
        System.out.println(new Date());
        System.out.print(sum);
    }

    static class Calculator extends RecursiveTask<Integer> {

        private static final int THRESHOLD = 100;
        private int start;
        private int end;

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


        @Override
        protected Integer compute() {
            int sum = 0;
            if ((start - end) < THRESHOLD) {
                for (int i = start; i < end; i++) {
                    sum += i;
                }
            } else {
                int middle = (start + end) / 2;
                Calculator left = new Calculator(start, middle);
                Calculator right = new Calculator(middle + 1, end);
                left.fork();
                right.fork();

                sum = left.join() + right.join();
            }
            return sum;
        }
    }

    class TstFJ1 extends RecursiveTask<Integer> {
        Integer times;

        public TstFJ1(Integer times) {
            System.out.println(times);
            this.times = times;
        }

        @Override
        protected Integer compute() {
            try {
                Thread.sleep(times);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if (times > 5000) {
                return 1;
            } else {
                return 0;
            }
        }
    }

    class TstFJ2 extends RecursiveTask<Integer> {
        Integer times;

        public TstFJ2(Integer times) {
            System.out.println(times);
            this.times = times;
        }

        @Override
        protected Integer compute() {
            try {
                Thread.sleep(times);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if (times > 5000) {
                return 1;
            } else {
                return 0;
            }
        }
    }
}
韩宏远  11:37:10
http://www.iteye.com/topic/643724
http://www.infoq.com/cn/articles/fork-join-introduction/
韩宏远  11:39:35
发烧友 21:58:57
写了一个并行计算的例子,可以用在接口校验上
发烧友 22:00:29
Wed Jun 29 21:56:39 CST 2016
4000
7000
Wed Jun 29 21:56:39 CST 2016
Wed Jun 29 21:56:46 CST 2016
1
发烧友 22:05:04
两个任务可以看做校验任务,校验正确返回0,错误返回1,一个4秒一个7秒,并行运算结果用时7秒
如果两个都返回0,认为校验正确,则执行文档插入,否则返回错误,
明天傲冰把校验改为并行方式

fork-join(多线程),主线程-分线程-主线程,通知返回

标签:

原文地址:http://www.cnblogs.com/tdf-/p/5752573.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!