zoukankan      html  css  js  c++  java
  • Java fork join ForkJoinPool 用法例子

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

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

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


    输出结果:

    forkjoincompute():computed final result=200030001

  • 相关阅读:
    docker compose 笔记
    一个简单的计划
    译Node.js应用的持续部署
    Javascript中的字典和散列
    施耐德保护调试技巧
    施耐德Sepam 40系列备自投逻辑
    请随时告诉自己
    顺其自然
    启用
    我们能做的是......
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/6231728.html
Copyright © 2011-2022 走看看