1. 程式人生 > >淺談 Fork/Join

淺談 Fork/Join

strong 我們 app ava 合並 行合並 append lines protected

fork/join的java7新添加的功能,能夠把它理解成一個並發框架。

我們通過fork/join能將一個可分解的大任務。分解成多個子任務同步運行。運行完成後,在將各子任務的結果進行合並,得到終於的結果。

使用fork/join,首先要創建fork/join任務。能夠通過繼承RecursiveActionRecursiveTask來實現(ForkJoinTask是它們的父類)

  • RecursiveAction 不返回結果
  • RecursiveTask 返回結果

經常用法

  • compute(); 計算方法(分拆的子任務)
  • fork(); // 運行子任務
  • join(); // 子任務結束後返回相應結果

ForkJoinPool
除此之外。java還提供了個ForkJoinPool的工具類。它實現了工作竊取算法,使得空暇線程能夠主動分擔從別的線程分解出來的子任務。從而讓全部的線程都盡可能處於飽滿的工作狀態。提高運行效率。

經常用法

  • execute(); //異步運行命令
  • invoke()和invokeAll(); // 異步運行命令。並返回相應結果
  • submit(); //異步運行命令,同一時候返回Future對象

使用方式例如以下

class Demo extends java.util.concurrent.RecursiveTask<Integer>{
    int
start; int end; public Demo(int start,int end){ this.start=start; this.end=end; } @Override protected Integer compute() { int sum=0; int s=start; int e=end; for(;s<=end;s++){ sum+=s; } return sum; } } @Test public
void test2(){ //1到1億。相加等於幾 0.37 Demo demo1=new Demo(1,50000000); Demo demo2=new Demo(50000001,100000000); demo1.fork(); demo2.fork(); System.out.println(demo1.join()+demo2.join()); } @Test public void test3(){ ForkJoinPool fjp=new ForkJoinPool(); Demo demo1=new Demo(1,50000000); Demo demo2=new Demo(50000001,100000000); System.out.println(fjp.invoke(demo1)+fjp.invoke(demo2)); }

淺談 Fork/Join