Java并发编程从入门到精通 之 第七章 JDK7新增的Fork/Join

3人阅读 评论(0) 收藏 举报
分类:
认识Future任务机制和FutureTask:
-1 FutureTask:
public class FutureTask<V> implements RunnableFuture<V> 
其中RunnableFuture实现了runnable和Future接口,所以可被线程执行,可得到Callable返回值。
-2 应用场景:
实际工作中,一个报表可分为多个模块给多个线程运算,然后再合并。而Fork/join是基于Ffuture实现


什么是Fork/Join框架:
-1 说明:Fork/Join是Java7提供的一个用于并行执行任务的框架,把大任务分割成小任务,最后汇总每个小任务结果到大任务。
-2 使用实例:
package forkJoin;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
import java.util.concurrent.RecursiveTask;
public class Demo01 {
       
       public static void main(String[] args) throws InterruptedException, ExecutionException {
              ForkJoinPool forkJoinPool = new ForkJoinPool();
              CountTask task = new CountTask(1, 5);
              Future<Integer> result = forkJoinPool.submit(task);
              System.out.println("1-5最终相加的结果:"+ result.get());
              CountTask task2 = new CountTask(1, 100);
              Future<Integer> result2 = forkJoinPool.submit(task2);
              System.out.println("1-100最终相加结果:" + result2.get());
              System.out.print("Thread main end");
       }
       
}
class CountTask extends RecursiveTask<Integer> {
       private static final long serialVersionUID = 3336021432713606929L;
       private static int splitSize = 2;
       private int start ,end;
       
       public CountTask(int start, int end) {
              this.start = start;
              this.end = end;
       }
       
       @Override
       protected Integer compute() {
              int sum = 0;
              //如果任务已经不需要再拆分了就开始计算
              boolean canCompute  = (end - start) <= splitSize;
              if(canCompute) {
                     for(int i = start; i <= end; i++) {
                           sum = sum + i;
                     }
              }else {
                     //拆分成两个子任务
                     int middle = (start + end)/2;
                     CountTask firstTask = new CountTask(start, middle);
                     CountTask secondTask = new CountTask(middle + 1, end);
                     firstTask.fork();//开始执行
                     secondTask.fork();//
                     //获得第一个子任务结果,得不到结果,此线程不会往下执行
                     int firstResult = firstTask.join();
                     int secondResult = secondTask.join();
                     //合并两个儿子的执行结果
                     sum = firstResult + secondResult;
              }
              return sum;
       }
       
}
实现compute,判断任务是否足够小,如果足够小就执行任务,反之分割成两个任务,然后子任务调用fork,又会进入compute,继续分割子任务。然后使用join等待子任务执行完就会返回结果.


认识Fork/Join的JDK里面的家族:
-1 Fork/Join完整图:

-2 ForkJoinPool三个方法:
execute 异步执行指定任务
invoke和invokeAll执行指定的任务,等待完成,返回结果。
submit异步执行指定任务,并返回Future对象。

 
Fork/Join框架的实现原理:
-1 说明:这是一个特殊的线程池框架,分解汇总子任务。比起传统线程池ThreadPoolExecutor,而ForkJoinPool实现窃取算法。
-2 工作窃取算法:指某个线程从其他队列里窃取任务来执行。


Fork/Join模式优缺点及其实现应用场景:
-1 优点:不需要处理并行相关,例如同步,通信死锁等,仅需关注如何划分任务和组合中间结果。
-2 缺点:应避免拆分过多,造成内存撑满。
-3 应用场景:适合树形遍历和分析,如文件遍历






查看评论

Java并发编程从入门到精通

  • 2017年07月19日 11:11
  • 31.53MB
  • 下载

Java并发编程从入门到精通.张振华(带详细书签)

  • 2017年12月13日 23:22
  • 93.43MB
  • 下载

Java并发编程从入门到精通 张振华.Jack --我的书

本书作者结合自已10多年Java并发编程经验,详细介绍了Java并发编程的基础概念、工作原理、编程技巧和注意事项,对Java高性能高并发编程有极大的参考价值。 本书内容包括并发编程概念,线程,线程安全...
  • tianya846
  • tianya846
  • 2015-07-26 22:46:29
  • 4454

《Java并发编程从入门到精通》目录

http://product.dangdang.com/23751808.html 第一部分:线程并发基础 第1章  概念部分 1.1  CPU核心数、线程数 1.2  CPU时间片轮转机...
  • brucexia
  • brucexia
  • 2015-11-05 17:43:57
  • 1403

《Java并发编程的艺术》读书笔记:Fork/Join框架

JDK1.7提供的Fork/Join框架,用于把大任务拆解成小任务,多线程运行这些小任务,最后把小任务的结果求和。看到这个思想,是否觉得很熟悉?这个和算法里的分治算法如出一辙,Divide and C...
  • bruce128
  • bruce128
  • 2016-04-04 16:18:21
  • 2455

java并发编程从入门到精通

  • 2018年03月26日 20:41
  • 93.38MB
  • 下载

使用Java7提供的Fork/Join框架

在Java7中,JDK提供对多线程开发提供了一个非常强大的框架,就是Fork/Join框架。这个是对原来的Executors更 进一步,在原来的基础上增加了并行分治计算中的一种Work-steali...
  • a352193394
  • a352193394
  • 2014-10-07 23:55:11
  • 17366

java 并发编程从入门到精通.pdf

  • 2018年03月14日 15:54
  • 93.41MB
  • 下载

java7并行计算框架Fork/Join

拆分fork+合并join。jdk1.7整合Fork/Join,性能上有大大提升。思想:充分利用多核CPU把计算拆分成多个子任务,并行计算,提高CPU利用率大大减少运算时间当你在ForkJoinPoo...
  • pzw_0612
  • pzw_0612
  • 2015-05-10 17:07:47
  • 1259

Java并发编程五:Fork/Join框架介绍

Fork/Join框架是什么Fork/Join框架是一个比较特殊的线程池框架,专用于需要将一个任务不断分解成多个子任务(分支),并将多个子任务的结果不断进行汇总得到最终结果(聚合)的并行计算框架。 ...
  • claram
  • claram
  • 2016-08-17 17:51:55
  • 4877
    个人资料
    等级:
    访问量: 25万+
    积分: 3273
    排名: 1万+