美文网首页
使用Fork/Join分割合并任务

使用Fork/Join分割合并任务

作者: JohnShen | 来源:发表于2017-02-10 17:03 被阅读83次
import org.apache.commons.lang3.time.StopWatch;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.Future;
import java.util.concurrent.RecursiveTask;

public class CountTask extends RecursiveTask<Integer> {
    int start = 0;
    int end = 0;
    // fork的阈值,即start,end相差大于2的时候,进行fork操作
    int threshold = 2;

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

    public static int sum(int start, int end) {
        int sum = 0;
        for (int i = start; i <= end; i++) {
            sum += i;

            // 让当前线程睡5秒,模拟某个耗时操作
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        return sum;
    }

    @Override
    protected Integer compute() {
        if (end - start <= threshold) {
            return sum(start, end);
        } else {
            int middle = (end + start) / 2;
            CountTask left = new CountTask(start, middle);
            CountTask right = new CountTask(middle + 1, end);
            left.fork();
            right.fork();

            int leftResult = left.join();
            int rightResult = right.join();
            return leftResult + rightResult;
        }
    }

    public static void main(String[] args) throws Exception {
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();

        ForkJoinPool forkJoinPool = new ForkJoinPool();
        Future<Integer> task = forkJoinPool.submit(new CountTask(1, 6));
        System.out.println("ForkJoin执行结果:" + task.get());

        stopWatch.stop();
        System.out.println("ForkJoin执行耗时:" + stopWatch.getTime() + "ms");

        stopWatch.reset();
        stopWatch.start();

        System.out.println("单线程顺序执行结果:" + sum(1, 6));

        stopWatch.stop();
        System.out.println("单线程顺序执行耗时:" + stopWatch.getTime() + "ms");
    }
}

执行的结果:

ForkJoin执行结果:21
ForkJoin执行耗时:15016ms
单线程顺序执行结果:21
单线程顺序执行耗时:30016ms

如果不模拟耗时操作的情况,执行的结果如下:

ForkJoin执行结果:21
ForkJoin执行耗时:15ms
单线程顺序执行结果:21
单线程顺序执行耗时:0ms

可以看出,在执行耗时操作的时候,ForkJoin方式性能的优势比较明显。而执行非耗时操作的时候,单线程的执行几乎不耗时,而ForkJoin方式有15ms,应该主要是线程创建和销毁的时间开销。

相关文章

  • 带你熟悉Java并行任务框架Fork/Join

    Fork/Join是什么? Fork意思是分叉,Join为合并。Fork/Join是一个将任务分割并行运行,然后将...

  • 使用Fork/Join分割合并任务

    执行的结果: 如果不模拟耗时操作的情况,执行的结果如下: 可以看出,在执行耗时操作的时候,ForkJoin方式性能...

  • 并发框架之Fork/Join框架

    今天来介绍一下java并发框架之Fork/Join 初探Fork/Join: 分割任务 使用一个fork类来把大任...

  • ForkjoinPool -3

    任务分割与等待:fork和join fork和join是ForkJoinTask的方法,也是整个框架的设计灵魂:f...

  • Java并发基础(七)

    1.fork/join示例 2使用分支/合并的最佳做法 对于一个任务调用join方法会阻塞调用方,直到该任务做出结...

  • Java并发-23.Fork/Join框架

    什么是Fork/Join框架Fork把一个大任务切分成若干个子任务Join把子任务的执行结果合并 工作窃取算法是什...

  • Java常用并发包

    一、Fork/Join Java7提供了Fork/Join用于并行执行任务的框架, 可以把一个大任务分割成若干个小...

  • Java7新特性8-fork/join框架

    Fork/Join框架 Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割...

  • Fork/Join框架任务分割

    1.概念 Fork/Join框架是一个实现了ExecutorService接口的多线程处理器。它可以把一个大的任务...

  • Fork/Join框架

    Fork/Join框架首先要考虑的是分割任务,当任务计算过大时分割成两个子任务分别计算 ForkJoinTask需...

网友评论

      本文标题:使用Fork/Join分割合并任务

      本文链接:https://www.haomeiwen.com/subject/inagittx.html