Java-Fork/Join的简单例子(入门)

fork/join的使用


1、创建一个ForkJoinPool,forkjoin池。


ForkJoinPool forkJoinPool = new ForkJoinPool();


2、创建一个task任务,任务继承自RecursiveTask,Integer表示返回结果的类型


CountTask task = new CountTask(14); 


3、用这个forkjoin池提交task, 返回一个Future类型的结果


Future result = forkJoinPool.submit(task);  


在任务task重写的compute() 方法中,如果,任务规模过大,需要创建子任务,子任务的执行使用subTask.fork(),子任务结果的返回使用subTask.join().


<-------------------------------------------------------------------------分割线--------------------------------------------------------------------------->

第一步分割任务。首先我们需要有一个fork类来把大任务分割成子任务,有可能子任务还是很大,所以还需要不停的分割,直到分割出的子任务足够小。

第二步执行任务并合并结果。分割的子任务分别放在双端队列里,然后几个启动线程分别从双端队列里获取任务执行。子任务执行完的结果都统一放在一个队列里,启动一个线程从队列里拿数据,然后合并这些数据。

[java]  view plain  copy
 
  1. public class CountTaskTmp extends RecursiveTask{  
  2.   
  3.     private static final int THRESHOLD = 2;  
  4.       
  5.     private int start;  
  6.       
  7.     private int end;  
  8.       
  9.     public CountTaskTmp(int start, int end) {  
  10.         this.start = start;  
  11.         this.end = end;  
  12.     }  
  13.   
  14.   
  15.     @Override  
  16.     protected Integer compute() {  
  17.         int sum = 0;  
  18.         boolean canCompute = (end - start) <= THRESHOLD;  
  19.         if (canCompute) {  
  20.             for (int i = start; i <= end; i++)  
  21.                 sum += i;  
  22.         } else {  
  23.             //如果任务大于阀值,就分裂成两个子任务计算  
  24.             int mid = (start + end) / 2;  
  25.             CountTask leftTask = new CountTask(start, mid);  
  26.             CountTask rightTask = new CountTask(mid+1, end);  
  27.               
  28.             //执行子任务  
  29.             leftTask.fork();  
  30.             rightTask.fork();  
  31.               
  32.             //等待子任务执行完,并得到结果  
  33.             int leftResult = (int)leftTask.join();  
  34.             int rightResult = (int)rightTask.join();  
  35.               
  36.             sum = leftResult + rightResult;  
  37.         }  
  38.           
  39.         return sum;  
  40.     }  
  41.       
  42.   
  43.     public static void main(String[] args) {  
  44.         ForkJoinPool forkJoinPool = new ForkJoinPool();  
  45.           
  46.         //生成一个计算资格,负责计算1+2+3+4    
  47.         CountTask task = new CountTask(14);   
  48.         Future result = forkJoinPool.submit(task);  
  49.         try {  
  50.             System.out.println(result.get());  
  51.         } catch (Exception e) {  
  52.         }  
  53.     }  
  54. }  

你可能感兴趣的:(Java,Java/多线程)