java并发编程(10)Fork/Join

Fork/Join

  JAVA7中出现的Fork/Join,类似于分布式文件系统hadoop的mapreduce思想,就是将任务分割,再分割,直到分割到满足条件

  为了便于理解:编程逻辑可以借用 递归的思想,层层递归,直到碰到最终调件,然后层层返回;而在Fork/Join中就是,类似把每个递归的方法,单独的放到一个线程中;

  充分利用现代多核处理器,对任务进行并行处理

  如:

  

/**
 * 继承RecursiveTask 则每个子任务带返回值
 * 继承RecursiveAction 则每个子任务不带返回值
 */
public class FockJoin1 extends RecursiveTask<Integer>{

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        long l = System.currentTimeMillis();
        ForkJoinPool pool = new ForkJoinPool();                         //类似线程池,也实现了AbstractExecutorService
        FockJoin1 task = new FockJoin1(1,1000000000);         //新建任务
        Future<Integer> result = pool.submit(task);                     //将任务提交
        System.out.println("result is" + result.get());                 //获取结果
        System.err.println(System.currentTimeMillis() - l);
    }

    private final Integer index = 5000; //分割任务的基数
    private final Integer left;
    private final Integer right;

    public FockJoin1(Integer left, Integer right) {
        this.left = left;
        this.right = right;
    }

    @Override
    protected Integer compute() {
        int sum = 0;
        if(right - left < index) {                      //如果任务 小于基数,则直接执行;类似递归的出口
            for (int i = left; i <= right; i++) {
                sum += i;
            }
        }else {                                         //任务 大于基数,则分割,类似与二分法,也可以更多
            int middle = (right + left) >> 1;
            FockJoin1 myf1 = new FockJoin1(left, middle);           //二分法左边
            FockJoin1 myf2= new FockJoin1(middle+1, right);    //二分法右边
            myf1.fork();                                            //继续执行,类似递归
            myf2.fork();                                            //继续执行,类似递归
            Integer integer1 = myf1.join();                         //等待
            Integer integer2 = myf2.join();
            sum = integer1 + integer2;                              //结果合并
        }
        return sum;
    }
}
时间: 2024-10-20 12:30:21

java并发编程(10)Fork/Join的相关文章

java并发编程10.构建自定义的同步工具

创建状态依赖类的最简单方法通常是在类库中现有状态依赖类的基础上进行构造.如果类库中没有提供你需要的功能,可以使用java语言和类库提供的底层机制来构造自己的同步机制,包括内置的条件队列.显示地Condition对象以及AbstractQueuedSynchronizer框架. 在单线程程序中调用方法时,如果基于某个状态的前提条件未得到满足,那么这个条件永远无法成真.而在并发程序中,基于状态的条件可能会由于其他线程的操作而改变. 可阻塞的状态依赖操作 acquire lock on object

java并发编程实战

java并发编程实战 Fork/Join 框架是JDK7提供的一个用于并行执行任务的框架,是一个把大任务切分为若干子任务并行的执行,最终汇总每个小任务后得到大任务结果的框架.我们再通过 Fork和Join来理解下Fork/Join框架.Fork就是把一个大任务划分成为若干子任务并行的执行,Join就是合并这些子任务的执行结果,最 后得到这个大任务的结果. 使 用Fork/Join框架时,首先需要创建一个ForkJoin任务(基础教程qkxue.net),它提供在任务中执行fork()和join操

Java 并发编程 -- Fork/Join 框架

概述 Fork/Join 框架是 Java7 提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架.下图是网上流传的 Fork Join 的运行流程图,直接拿过来用了: 工作窃取算法 工作窃取(work-stealing)算法是指某个线程从其他队列里窃取任务来执行.那么为什么要使用这个算法呢?假如我们需要做一个比较大的任务,可以把这个任务分割为若干个互不依赖的子任务,为了减少线程间的竞争,把这些子任务分别放到不同的队列里,并为每个队列创

Java 并发编程:线程间的协作(wait/notify/sleep/yield/join)

Java并发编程系列[未完]: Java 并发编程:核心理论 Java并发编程:Synchronized及其实现原理 Java并发编程:Synchronized底层优化(轻量级锁.偏向锁) Java 并发编程:线程间的协作(wait/notify/sleep/yield/join) 一.线程的状态 Java中线程中状态可分为五种:New(新建状态),Runnable(就绪状态),Running(运行状态),Blocked(阻塞状态),Dead(死亡状态). New:新建状态,当线程创建完成时为新

Java并发编程有多难?这几个核心技术你掌握了吗?

本文主要内容索引 1.Java线程 2.线程模型 3.Java线程池 4.Future(各种Future) 5.Fork/Join框架 6.volatile 7.CAS(原子操作) 8.AQS(并发同步框架) 9.synchronized(同步锁) 10.并发队列(阻塞队列) 本文仅分析java并发编程中的若干核心问题,对于上面没有提到但是又和java并发编程有密切关系的技术将会不断添加进来完善文章,本文将长期更新,不断迭代.本文试图从一个更高的视觉来总结Java语言中的并发编程内容,希望阅读完

Java并发编程入门与高并发面试

第1章 课程准备(入门课程)课程目标:Java并发编程入门,适合没有并发编程经验的同学,本章首先从课程重点.特点.适合人群及学习收获几个方面对课程进行整体的介绍,然后会从一个实际的计数场景实现开始,给大家展示多线程并发时的线程不安全问题,让大家能够初体验到并发编程,之后会讲解并发和高并发的概念,并通过对比让大家明白到底什么是并发和...1-1 课前必读(不看会错过一个亿)1-2 课程导学1-3 并发编程初体验1-4 并发与高并发基本概念(选看)1-5 JAVA内存模型1-6 并发的优势与风险(选

Java并发指南开篇:Java并发编程学习大纲

Java并发编程一直是Java程序员必须懂但又是很难懂的技术内容. 这里不仅仅是指使用简单的多线程编程,或者使用juc的某个类.当然这些都是并发编程的基本知识,除了使用这些工具以外,Java并发编程中涉及到的技术原理十分丰富.为了更好地把并发知识形成一个体系,也鉴于本人没有能力写出这类文章,于是参考几位并发编程专家的博客和书籍,做一个简单的整理. 一:并发基础和多线程 首先需要学习的就是并发的基础知识,什么是并发,为什么要并发,多线程的概念,线程安全的概念等. 然后学会使用Java中的Threa

Java 并发编程 回忆提纲、总结

参考资料:<Java并发编程的艺术> 用于快速回忆,详情请看书籍原文 1. 一些概念 1.1 上下文切换 定义:任务从保存到再加载的过程 减少上下文切换 无锁并发编程:将临界资源划分给不同线程各自访问 CAS算法 最少线程原则:不创建无用的线程 协程:在单线程里面实现多任务调度(IO多路复用) 1.2 死锁 死锁:两个或两个以上的线程在执行过程中,由于竞争临界资源或者而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去 减少死锁的发生 避免一个线程同时获取多个锁 避免线程在锁内占用过多的

6、Java并发编程:volatile关键字解析

Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字才得以重获生机. volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情.由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来了解一下与内存模型相关的概念和知识,然后分析了volatil

7、Java并发编程:深入剖析ThreadLocal

Java并发编程:深入剖析ThreadLocal 想必很多朋友对ThreadLocal并不陌生,今天我们就来一起探讨下ThreadLocal的使用方法和实现原理.首先,本文先谈一下对ThreadLocal的理解,然后根据ThreadLocal类的源码分析了其实现原理和使用需要注意的地方,最后给出了两个应用场景. 以下是本文目录大纲: 一.对ThreadLocal的理解 二.深入解析ThreadLocal类 三.ThreadLocal的应用场景 若有不正之处请多多谅解,并欢迎批评指正. 请尊重作者