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

技术: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

最新文章

  1. Java抛出OutOfMemoryError:Java heap space堆内存溢出错误的分析方案
  2. STM32之PWM波形输出配置总结
  3. servlet jsp 客户端服务端跳转
  4. C# DevExpress 的gridControl或gridView数据导出失败解决方法
  5. Error Dropping Database (Can&#39;t rmdir &#39;.test\&#39;, errno: 17)
  6. myeclipse的一些设置
  7. Redis 命令 - Sorted Sets
  8. SQLServer行转列
  9. 安装PHP memcached扩展
  10. 07-Python入门学习-字符编码与文件处理
  11. 【Linux】Jenkins安装(二)
  12. eclipse自动生成变量名声明(按方法返回值为本地变量赋值)
  13. L1 与 L2 正则化
  14. 配置使用 git 秘钥连接 GitHub
  15. CSS知识点(三)
  16. Java NIO系列教程(五)Buffer
  17. C#实现的三种方式实现模拟键盘按键
  18. Log4j2的基本使用
  19. IronPython Architecture
  20. TPM--Trusted Platform Module

热门文章

  1. AngularJS渲染性能分析
  2. WinRAR 5.40无弹窗广告注册版下载
  3. 3. CONFIGURATION官网剖析(博主推荐)
  4. BZOJ2716: [Violet 3]天使玩偶(KD-Tree)
  5. Windows上安装多个MySQL实例(转)
  6. android插件式开发资料整理
  7. action中json的应用
  8. JS/CSS 响应式样式实例
  9. GitHub上常用命令(工作中几乎每天用到的命令)
  10. ThinkPHP5.0---删除数据