淺談 Fork/Join
阿新 • • 發佈:2017-07-24
strong 我們 app ava 合並 行合並 append lines protected
fork/join的java7新添加的功能,能夠把它理解成一個並發框架。
我們通過fork/join能將一個可分解的大任務。分解成多個子任務同步運行。運行完成後,在將各子任務的結果進行合並,得到終於的結果。
使用fork/join,首先要創建fork/join任務。能夠通過繼承RecursiveAction或RecursiveTask來實現(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