Java fork join ForkJoinPool 用法例子

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

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

[java] view plain copy print?

  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. }

[java] view plain copy print?

输出结果:

forkjoincompute():computed final result=200030001

时间: 2024-08-07 21:54:59

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

Java fork/join framework小试兼RecursiveAction类的应用

假设要做这么一件事:给你一个double类型数组,让你求这个数组的元素的倒数和,怎么做?当然是先求倒数,然后再求和啦.没错,就是这样,但是如果你有多个cpu core呢?比如四个core, 线性地这么去求是不是有些浪费计算资源,或者说没有充分利用多核的条件以降低执行时间呢?那可不可以把这这个数组拆分成4段,每个核去计算一段的倒数和,然后等都计算完成了,再把结果相加呢?当然可以!就应该这样做,那java中怎么做呢?用fork/join框架就可以了,使用的方法之一是利用RecursiveAction

浅谈Java Fork/Join并行框架

初步了解Fork/Join框架 Fork/Join 框架是java7中加入的一个并行任务框架,可以将任务分割成足够小的小任务,然后让不同的线程来做这些分割出来的小事情,然后完成之后再进行join,将小任务的结果组装成大任务的结果.下面的图片展示了这种框架的工作模型: 使用Fork/Join并行框架的前提是我们的任务可以拆分成足够小的任务,而且可以根据小任务的结果来组装出大任务的结果,一个最简单的例子是使用Fork/Join框架来求一个数组中的最大/最小值,这个任务就可以拆成很多小任务,大任务就是

hello java fork/join for java

1,示例 import java.util.concurrent.RecursiveTask; public class Calculator extends RecursiveTask<Integer> { private static final int THRESHOLD = 4; private int start; private int end; public Calculator(int start, int end) { this.start = start; this.end

Java Fork/Join框架

fork-join框架 fork操作的作用是把一个大的问题划分成若干个较小的问题.在这个划分过程一般是递归进行的.直到可以直接进行计算.需要恰当地选取子问题的大小.太大的子问题不利于通过并行方式来提高性能,而太小的子问题则会带来较大的额外开销.每个子问题计算完成后,可以得到关于整个问题的部分解.join操作的作用是把这些分解手机组织起来,得到完整解. 在fork/join框架中,若某个子问题由于等待另一个子问题的完成而无法继续执行.那么处理该子问题的线程会主动寻找其他尚未运行完成的子问题来执行.

Java Thread join() 的用法

Java Thread中, join() 方法主要是让调用改方法的thread完成run方法里面的东西后, 在执行join()方法后面的代码.示例: Java代码   class ThreadTesterA implements Runnable { private int counter; @Override public void run() { while (counter <= 10) { System.out.print("Counter = " + counter +

《java.util.concurrent 包源码阅读》22 Fork/Join框架的初体验

JDK7引入了Fork/Join框架,所谓Fork/Join框架,个人解释:Fork分解任务成独立的子任务,用多线程去执行这些子任务,Join合并子任务的结果.这样就能使用多线程的方式来执行一个任务. JDK7引入的Fork/Join有三个核心类: ForkJoinPool,执行任务的线程池 ForkJoinWorkerThread,执行任务的工作线程 ForkJoinTask,一个用于ForkJoinPool的任务抽象类. 因为ForkJoinTask比较复杂,抽象方法比较多,日常使用时一般不

《java.util.concurrent 包源码阅读》24 Fork/Join框架之Work-Stealing

仔细看了Doug Lea的那篇文章:A Java Fork/Join Framework 中关于Work-Stealing的部分,下面列出该算法的要点(基本是原文的翻译): 1. 每个Worker线程都维护一个任务队列,即ForkJoinWorkerThread中的任务队列. 2. 任务队列是双向队列,这样可以同时实现LIFO和FIFO. 3. 子任务会被加入到原先任务所在Worker线程的任务队列. 4. Worker线程用LIFO的方法取出任务,也就后进队列的任务先取出来(子任务总是后加入队

Java多线程之~~~Fork/Join框架的同步和异步

在Fork/Join框架中,提交任务的时候,有同步和异步两种方式.以前使用的invokeAll()的方法是同步的,也就是任 务提交后,这个方法不会返回直到所有的任务都处理完了.而还有另一种方式,就是使用fork方法,这个是异步的.也 就是你提交任务后,fork方法立即返回,可以继续下面的任务.这个线程也会继续运行. 下面我们以一个查询磁盘的以log结尾的文件的程序例子来说明异步的用法. package com.bird.concursey.charpet8; import java.io.Fil

JAVA并行框架Fork/Join(二):同步和异步

在Fork/Join框架中,提交任务的时候,有同步和异步两种方式. invokeAll()的方法是同步的,也就是任务提交后,这个方法不会返回直到所有的任务都处理完了. fork方法是异步的.也就是你提交任务后,fork方法立即返回,可以继续下面的任务.这个线程也会继续运行. 下面我们以一个查询磁盘的以log结尾的文件的程序例子来说明异步的用法. package com.bird.concursey.charpet8; import java.io.File; import java.util.A