本例是把一个大的数组求和的计算的大任务分解到在小范围内求和的小任务,然后把这些小任务之和加起来就是所求之结果。

技术:JDK8.0, Javafork-join模式下的RecursiveTask技术,override compute().

  1. /**
  2. * Author: Bigtree
  3. * 本例是把一个大的数组求和的计算的大任务分解到在小范围内求和的小任务,然后把这些小任务之和加起来就是所求之结果。
  4. * 技术:
  5. * java fork-join模式下的RecursiveTask技术,override compute().
  6. */
  7. import java.util.*;
  8. import java.util.concurrent.*;
  9. class Caltask extends RecursiveTask<Long>{
  10. private static final int THRESHOLD = 1000; //how many numbers one thread can calculate
  11. private long data[];
  12. private int start;
  13. private int end;
  14. public Caltask(long[] inputData,int start, int end){
  15. data=inputData;
  16. this.start=start;
  17. this.end=end;
  18. }
  19. @Override
  20. protected Long compute() {
  21. Long sumResult=0L;
  22. if((end - start) <= THRESHOLD ){
  23. for(int index=start; index<end;index++) {
  24. sumResult += data[index];
  25. }
  26. }
  27. else { //parallel computing
  28. int step=(end-start)/THRESHOLD;
  29. if(((end-start)%THRESHOLD)>0)
  30. step+=1;
  31. ArrayList<Caltask> tasks = new ArrayList<>();
  32. int pos=start;
  33. int lastposition;
  34. for(int i=0;i<step;i++){
  35. lastposition=pos+THRESHOLD;
  36. if(lastposition>end)
  37. lastposition=end;
  38. Caltask onetask= new Caltask(data,pos,lastposition);
  39. pos=lastposition;
  40. tasks.add(onetask);
  41. onetask.fork();
  42. }
  43. for(Caltask mtask : tasks){
  44. sumResult += mtask.join();
  45. }
  46. }
  47. return sumResult;
  48. }
  49. }
  50. public class forkjoincompute {
  51. public static void ForkJoinShow(){
  52. long data[] = new long[20001];
  53. for(long i=0;i<data.length;i++){
  54. data[(int) i]= i + 1;
  55. }
  56. ForkJoinPool mypool= ForkJoinPool.commonPool();
  57. Future<Long> myfuture = mypool.submit( new Caltask(data,0,data.length));
  58. try{
  59. long result=myfuture.get();
  60. System.out.println("forkjoincompute():computed final result="+result);
  61. } catch(InterruptedException e){
  62. e.printStackTrace();
  63. } catch (ExecutionException e) {
  64. // TODO Auto-generated catch block
  65. e.printStackTrace();
  66. }
  67. mypool.shutdown();
  68. }
  69. }

输出结果:

forkjoincompute():computed final result=200030001

Java fork join ForkJoinPool 用法例子的更多相关文章

  1. java Fork/Join框架

    应用程序并行计算遇到的问题 当硬件处理能力不能按摩尔定律垂直发展的时候,选择了水平发展.多核处理器已广泛应用,未来处理器的核心数将进一步发布,甚至达到上百上千的数量.而现在很多的应用程序在运行在多核心 ...

  2. Java Fork/Join 框架

    简介 从JDK1.7开始,Java提供Fork/Join框架用于并行执行任务,它的思想就是讲一个大任务分割成若干小任务,最终汇总每个小任务的结果得到这个大任务的结果. 这种思想和MapReduce很像 ...

  3. Fork/Join 框架-设计与实现(翻译自论文《A Java Fork/Join Framework》原作者 Doug Lea)

    作者简介 Dong Lea任职于纽约州立大学奥斯威戈分校(State University of New York at Oswego),他发布了第一个广泛使用的java collections框架实 ...

  4. JAVA FORK JOIN EXAMPLE--转

    http://www.javacreed.com/java-fork-join-example/ Java 7 introduced a new type of ExecutorService (Ja ...

  5. java fork/join简单实践

    我们知道,java8中有并行流,而并行流在后台的实现是通过fork/join池来完成的,例如: List<Integer> a = buildList(); List<Integer ...

  6. Java Fork/Join

    Fork/Join框架 Fork/Join 以递归方式将可以并行的任务拆分成更小的任务,然后将每个子任务的结果合并起来生成整体结果. 这个过程其实就是分治算法的并行版本,图解如下: 如何使用 我们要使 ...

  7. fork...join的用法

    如果希望在仿真的某一时刻同时启动多个任务,可以使用fork....join语句.例如,在仿真开始的 100 ns 后,希望同时启动发送和接收任务,而不是发送完毕后再进行接收,如下所示: initial ...

  8. Java Thread join() 的用法

    Java Thread中, join() 方法主要是让调用改方法的thread完成run方法里面的东西后, 在执行join()方法后面的代码.示例: class ThreadTesterA imple ...

  9. Java并发——Fork/Join框架与ForkJoinPool

    为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/ShiJiaqi. http://www.cnblogs.com/shijiaqi1066/p/4631466. ...

随机推荐

  1. inflater-布局转化实现

    通俗的说,inflate就相当于将一个xml中定义的布局找出来.因为在一个Activity里如果直接用findViewById()的话,对应的是setConentView()的那个layout里的组件 ...

  2. 嵌入式 Linux应用程序如何读取(修改)芯片寄存器的值

    这一问题来自项目中一个实际的需求:我需要在Linux启动之后,确认我指定的芯片寄存器是否与我在uboot的配置一致. 举个例子:寄存器地址:0x20000010负责对DDR2的时序配置,该寄存器是在u ...

  3. .NET Entity Framework入门操作

    Entity Framework是微软借鉴ORM思想开发自己的一个ORM框架. ORM就是将数据库表与实体对象(相当于三层中的Model类)相互映射的一种思想. 最大的优点就是非常方便的跨数据库平台. ...

  4. golang round

    func Round(f float64, n int) float64 {pow10_n := math.Pow10(n)return math.Trunc((f+0.5/pow10_n)*pow1 ...

  5. 关于EJB--实体Bean的BMP和CMP选择

    EJB有两种主要类型BMP(Bean managed persistence )和CMP(Container managed persistence ),这两种类型各有优缺点. BMP是在Bean中完 ...

  6. socket 笔记(一)

    #include "stdafx.h" #include "WINSOCK2.H" #pragma comment(lib,"WS2_32.lib&q ...

  7. eclipse4.3怎么集成jadclipse追踪源代码,现在windows-preferences-java

      A.将net.sf.jadclipse_3.2.4.jar复制到D:\leaf\eclipse\plugins目录下.  B.在d:\leaf下建立ecliplsePlungin\jadclips ...

  8.  洛谷 P3056 [USACO12NOV]笨牛Clumsy Cows

    P3056 [USACO12NOV]笨牛Clumsy Cows 题目描述 Bessie the cow is trying to type a balanced string of parenthes ...

  9. 【Java】Java Socket 通信演示样例

    用socket(套接字)实现client与服务端的通信. 这里举两个样例: 第一种是每次client发送一个数据,服务端就做一个应答. (也就是要轮流发) 另外一种是client能够连续的向服务端发数 ...

  10. Xcode6:No architectures to compile for(ONLY_ACTIVE_ARCH=YES...)

    1.问题描写叙述 Xcode6真机測试旧project,不能执行,报错例如以下: 2.解决方式 问题非常明显,当前的执行模式设置了ONLY_ACTIVE_ARCH为Yes,当时的project的Val ...