故名思義,拆分fork+合並join。jdk1.7整合Fork/Join,性能上有大大提升。
思想:充分利用多核CPU把計算拆分成多個子任務,並行計算,提高CPU利用率大大減少運算時間。有點像,MapReduce思路感覺大致一樣。
jdk7中已經提供了最簡潔的接口,讓你不需要太多時間關心並行時線程的通信,死鎖問題,線程同步,下面是它提供的接口:
簡單示例:
package tank.forjoin.demo; import java.util.concurrent.RecursiveTask; /** * @author tank * @date:2014-8-27 下午01:30:06 * @description: * @version :任務 * futrue: * forkjoinTask:recursiveTask recursiveAction */ public class Demo1 extends RecursiveTask<Integer> { private int start; private int end; public Demo1(int start, int end) { this.start = start; this.end = end; } //計算 @Override protected Integer compute() { int sum = 0; if (start - end < 100) { for (int i = start; i < end; i++) { sum += i; } } else {//間隔有100則拆分多個任務計算 int middle = (start + end) / 2; Demo1 left = new Demo1(start, middle); Demo1 right = new Demo1(middle + 1, end); left.fork(); right.fork(); sum = left.join() + right.join(); } return sum; } }
package tank.forjoin.demo; import java.util.concurrent.ExecutionException; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.Future; import org.junit.Test; /** * @author tank * @date:2014-8-27 下午01:50:20 * @description: * @version : */ public class TestDemo1 { @Test public void testDemo1() throws InterruptedException, ExecutionException { ForkJoinPool forkJoinPool = new ForkJoinPool();//對線程池的擴展 Future<Integer> result = forkJoinPool.submit(new Demo1(1, 10000)); System.out.println(result.get());
forkJoinPool.shutdown(); } }
RecursiveAction 無返回值任務。
RecursiveTask有返回值類型。
ForkJoinPool提供了一系列的submit方法,計算任務。ForkJoinPool默認的線程數通過Runtime.availableProcessors()獲得,因為在計算密集型的任務中,獲得多於處理性核心數的線程並不能獲得更多性能提升。