什么是fork / join框架在java 7.0 (并行编程)?

在java中,fork / join框架已经出台 7 解决编程问题multi-threading/parallel的.

这是非常难以处理并发 (并行) 使用传统方式进行编程. 因为你要处理的线程同步, 通知, 加入等共享资源的陷阱. 在Java平台上的并行编程语言级的支持是非常强大的,在不同社区的努力证明. 这些社区都试图提供全面的编程模型和高效的实现多线程和分布式applications.Java平台伴有痛点抽象, 标准版 (Java SE的) 5 然后的Java SE 6 推出一组包 (执行人服务)提供强大的并发构建块. Java SE的 7 进一步提高的框架中加入更多的支持并行.

在java的fork / join是一个新概念 7.0 版本. 这个框架的基本目的是为了方便在Java应用程序中的多线程环境. 越细,然后执行人服务框架是fork / join框架. 它需要所有的处理能力的优势,因此应用程序获取更多的资源和处理能力. 这是一个实现ExecutorService的接口,帮助您充分利用多个处理器. 它是专为快它可以分解成更小的碎片,递归的,从而作出处理工程.

类似的ExecutorService, fork / join框架还工人线程池中的线程分配任务. 但是,主要的区别在于fork / join框架使用工作窃取算法. 这里的工人的线程用完要做的事情可以从其他线程还在忙着偷任务. 是一个扩展ForkJoinPoolclass的AbstractEx​​ecutorService和心脏的框架. ForkJoinPool工作窃取实现了核心算法和执行ForkJoinTasks的.
现在让我举个例子来理解这个概念在细节.

基本步骤是
· 拆分任务
· 它分配的可用线程
· 完成后加入块,并使其完成

让我们以一个列表,其中将包含大量随机生成的整数.

这个类是传统的方式做任务.

package javablog.levent.com;
import java.util.Random;
// This class defins a list which will contain large number of integers.
public class LargeInteger {
private final int[] list = new int[2000000];
public largeInteger() {
Random generator = new Random(19580427);
for (int i = 0; i < list.length; i++) {
list[i] = generator.nextInt(500000);
}
}
public int[] getList() {
return list;
}
}

现在下列SplitTask类进行分割,并加入任务.

package javablog.levent.com;
import java.util.Arrays;
import jsr166y.forkjoin.RecursiveAction;
public class SplitTask extends RecursiveAction {
private int[] list;
public long result;
public SplitTask(int[] array) {
this.list = array;
}

@覆盖
保护无效的计算() {
如果 (list.length == 1) {
结果=列表[0];
} 其他 {
中点= list.length / 2;
诠释[] L1 = Arrays.copyOfRange(表, 0, 中点);
诠释[] L2 = Arrays.copyOfRange(表, 中点, list.length);
SplitTask S1 =新SplitTask(L1);
SplitTask S2 =新SplitTask(12);
forkJoin(S1, S2);
结果= s1.result的 + s2.result;
}
}
}

最后一类是测试过程. 调用ForkJoinExecutor的池来执行任务.

package javablog.levent.com;
import jsr166y.forkjoin.ForkJoinExecutor;
import jsr166y.forkjoin.ForkJoinPool;
import javablog.levent.com.SplitTask;
public class TestForkJoin {
public static void main(String[] args) {
LargeInteger test = new LargeInteger();
// Check the number of available processors
int nThreads = Runtime.getRuntime().availableProcessors();
System.out.println(nThreads);
SplitTask mfj = new SplitTask(test.getList());
ForkJoinExecutor pool = new ForkJoinPool(nThreads);
pool.invoke(mfj);
long result = mfj.getResult();
System.out.println("Done. Result: " + result);

}
}

============================================= ============================================== 在亚马逊上购买最佳技术书籍,en,电工CT Chestnutelectric,en
============================================== ---------------------------------------------------------------- electrician ct chestnutelectric
error

Enjoy this blog? Please spread the word :)

Follow by Email
LinkedIn
LinkedIn
Share