对于框架的原理,可以阅读 Doug Lea 的文章“A Java Fork/Join Framework”:了解 Fork/Join 模式的实现机制和执行性能。
原理解析:fork分解,join结合。这个框架的本质是将一个任务分解成多个子任务,每个子任务用单独的线程去处理。这里用到了递归的思想。框架的结构图可以参考
图片来源(http://www.ibm.com/developerworks/cn/java/j-lo-forkjoin/index.html)
使用fork/join 框架很简单,
1.实现子问题的一般求解算法
2.如何分解问题
3.继承 RecursiveAction ,实现compute()方法
Result solve(Problem problem) {
if (problem is small)
directly solve problem
else {
split problem into independent parts
fork new subtasks to solve each part
join all subtasks
compose result from subresults
}
}
这里我通过一个改进的二分查找来讲解fork/join的使用。(后面才发现,选用这个案例是非常失败的,因为二分查找的时间是logn,而创建线程的开销更大,这样并不能体现多线程二分查找的优势,所以这个代码不具有实用性,只是为了说明如何使用框架:)
代码如下:
BinarySearchProblem.java
package testjdk7;
import java.util.Arrays;
/**
* @author kencs@foxmail.com
*/
public class BinarySearchProblem {
private final int[] numbers;
private final int start;
private final int end;
public final int size;
public BinarySearchProblem(int[] numbers,int start,int end){
this.numbers = numbers;
this.start = start;
this.end = end;
this.size = end -start;
}
public int searchSequentially(int numberToSearch){
//偷懒,不自己写二分查找了
return Arrays.binarySearch(numbers, start, end, numberToSearch);
}
public BinarySearchProblem subProblem(int subStart,int subEnd){
return new BinarySearchProblem(numbers,start+subStart,start+subEnd);
}
}
BiSearchWithForkJoin.java
package testjdk7;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveAction;
/**
* @author kencs@foxmail.com
*/
public class BiSearchWithForkJoin extends RecursiveAction {
private final int threshold;
private final BinarySearchProblem problem;
public int result;
private final int numberToSearch;
public BiSearchWithForkJoin(BinarySearchProblem problem,int threshold,int numberToSearch){
this.problem = problem;
this.threshold = threshold;
this.numberToSearch = numberToSearch;
}
@Override
protected void compute() {
if(problem.size < threshold){ //小于阀值,就直接用普通的二分查找
result = problem.searchSequentially(numberToSearch);
}else{
//分解子任务
int midPoint = problem.size/2;
BiSearchWithForkJoin left = new BiSearchWithForkJoin(problem.subProblem(0, midPoint),threshold,numberToSearch);
BiSearchWithForkJoin right = new BiSearchWithForkJoin(problem.subProblem(midPoint+1, problem.size),threshold,numberToSearch);
invokeAll(left,right);
result = Math.max(left.result, right.result);
}
}
//构造数据
private static final int[] data = new int[1000_0000];
static{
for(int i = 0;i<1000_0000;i++){
data[i] = i;
}
}
public static void main(String[] args){
BinarySearchProblem problem = new BinarySearchProblem(data,0,data.length);
int threshold = 100;
int nThreads = 10;
//查找100_0000所在的下标
BiSearchWithForkJoin bswfj = new BiSearchWithForkJoin(problem,threshold,100_0000);
ForkJoinPool fjPool = new ForkJoinPool(nThreads);
fjPool.invoke(bswfj);
System.out.printf("Result is:%d%n",bswfj.result);
}
}
RecursiveTask 还可以带返回值,这里给出一段代码作为参考(斐波那契函数)
(来自http://www.ibm.com/developerworks/cn/java/j-lo-forkjoin/index.html)
class Fibonacci extends RecursiveTask<Integer> {
final int n;
Fibonacci(int n) {
this.n = n;
}
private int compute(int small) {
final int[] results = { 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89 };
return results[small];
}
public Integer compute() {
if (n <= 10) {
return compute(n);
}
Fibonacci f1 = new Fibonacci(n - 1);
Fibonacci f2 = new Fibonacci(n - 2);
System.out.println("fork new thread for " + (n - 1));
f1.fork();
System.out.println("fork new thread for " + (n - 2));
f2.fork();
return f1.join() + f2.join();
}
}
用途
只要问题能够分解成类似子问题的,都可以使用这个框架。对于大批量的数据尤其合适
参考资料
Jdk7官网 http://openjdk.java.net/projects/jdk7/
(注:这篇文章发表时,JDK7未正式公布,可能有误差,具体以官方正式版为准)
更多的jdk7文章,欢迎访问http://janeky.iteye.com/category/157060
- 大小: 78.5 KB
分享到:
相关推荐
5. **JDK7新特性<五> fork/join 框架** Fork/Join框架是Java并行编程的一个重要工具,它基于分治策略,允许开发者将大任务拆分成小任务,然后并行执行,最后合并结果,显著提高了处理大规模计算任务的能力。 6. **...
Fork/Join框架是Java7引入的一种用于并行任务执行的框架,它允许将复杂任务拆分成多个子任务,并行执行,然后通过join操作将结果聚合。Fork/Join框架特别适合处理可以递归拆分的计算密集型任务,比如大数据集的搜索...
### Jdk7新特性 #### 1. Try-with-resources Java 7引入了一个非常实用的特性——try-with-resources,它使得资源管理更加方便且安全。在try语句中声明的资源会在finally块中自动关闭,无论是否发生异常。这适用于...
ForkJoin框架自Java 7引入,它为处理大型任务提供了一种分解成多个子任务并行执行的机制,然后合并子任务的结果。这种机制特别适合处理可以被分解的问题,例如计算、搜索等。 首先,让我们回顾一下传统的并发实现...
ForkJoin框架的目标就是利用多核处理器的并行能力,提高程序的执行效率。 ForkJoin框架中的核心类`ForkJoinPool`是一个特殊的线程池,它专门为ForkJoinTask设计。与标准的ExecutorService不同,`ForkJoinPool`使用...
首先,JDK7是Oracle公司发布的Java平台标准版(Java Platform, Standard Edition)的第七个主要版本,它引入了多项重要的新特性和改进。例如,动态语言支持、Fork/Join框架、并发工具的增强以及新的编译器——CTW...
JDK 7增加了对Fork/Join框架的支持,这是一种用于并行任务处理的新模型。通过将大的计算任务拆分成多个小任务来并行执行,可以极大地提高程序的运行效率,特别是在多核处理器环境中。 ##### 2.4 安全性改进 JDK 7...
在并发编程领域,JDK7引入了Fork/Join框架,这是一种并行计算模型,适用于那些可以拆分为更小子任务的问题,例如在大量数据处理中,能显著提升性能。 JDK7还对垃圾回收机制进行了优化,包括G1(Garbage-First)垃圾...
JDK1.7,即Java Development Kit的第7个主要版本,带来了诸多新特性和改进,极大地提升了开发效率和代码质量。本文将以"JDK1.7demo"为引子,深入探讨这个版本中的关键知识点,并通过源码实例解析,帮助开发者更好地...
3. **多线程改进**:JDK 7提供了`Fork/Join`框架,这是一种基于工作窃取算法的并行编程模型,用于高效地执行大量可分解的任务。 4. **try-with-resources语句**:这个新特性允许自动关闭实现了`AutoCloseable`接口...
5. **Fork/Join Framework and Parallel Array Operations**: 引入了Fork/Join框架,用于并行执行任务,提高计算密集型任务的性能。同时,提供了一系列的并行数组操作方法,如`Arrays.parallelSort()`。 6. **NIO.2...
10. **并发改进**:`Fork/Join框架`的引入使得并行计算变得更加简单。`CompletableFuture`类提供了异步编程的支持,可以方便地组合多个异步任务。 以上就是JDK8中的主要新特性,它们极大地扩展了Java的功能,提高了...
JDK1.7新特性介绍 1. 对Java集合(Collections)的增强支持 2. 在Switch中可用String 在JDK7 的正式版本中,你可以在switch的表达式中用String类型 3. 数值可加下划线 下划线字符(_)能够出现在数字字面量的数字...
其次,多线程处理方面,JDK7引入了Fork/Join框架,它是并行计算的一个强大工具。通过`java.util.concurrent.ForkJoinPool`和`java.util.concurrent.ForkJoinTask`类,开发者可以创建分而治之的任务,有效地利用多核...
6. **Fork/Join框架(Fork/Join Framework)**:用于并行计算的新框架,基于工作窃取算法。 7. **新的Swing事件模型**:改进了Swing GUI库的事件处理机制。 8. **改进的JSON支持**:提供了一个新的`javax.json`包来...
在多线程编程方面,JDK7引入了Fork/Join框架,这是一个并行计算的模型,它将大型任务分解为小任务,然后在多个线程中并行执行,从而提高了程序的执行速度。 JDK7的“switch”语句也得到了扩展,现在可以接受字符串...
在多线程处理上,JDK 1.7增强了Fork/Join框架,这是一个并行计算模型,用于分割大型任务并行执行,然后合并结果。它通过RecursiveTask和RecursiveAction类实现,对于大数据处理和计算密集型应用非常有用。 此外,...
- **Multithreading with Fork/Join Framework**:Fork/Join框架提供了并行执行任务的能力,通过将大任务拆分为小任务来提升性能。 - **Improvedtry-catch**:新的try-with-resources语法使得资源管理更加简洁,...
7. **Fork/Join框架**(`java.util.concurrent.ForkJoinPool`和`java.util.concurrent.ForkJoinTask`):这是一个并行计算框架,用于执行分治策略任务,提高了计算密集型任务的效率。 8. **元空间(MetaSpace)**:...
1. **多线程并发控制**:引入了Fork/Join框架,通过工作窃取算法提高并行计算效率,同时提供了`Phaser`、`CountDownLatch` 和 `CyclicBarrier` 等并发工具类。 2. **Strings in Switch**:在switch语句中可以直接...