java线程_ 任务分解工具fork_join实现并行计算
2011年12月29日 共有137次浏览
本文是java并发编程之线程系列的第十八篇。介绍了任务分解工具fork_join,可实现并行计算。fork/join的处理方法,将问题递归的分成多个子问题,直到每个子问题足够的小,能够高效率的串行的处理。递归的过程,就是把问题分成两个或者更多的子问题,然后把这些问题放入队列里(fork步骤),然后等待所有子问题的结果(join步骤),最终把所有的结果合并在一起。另外需要注意的是fork/join 是jdk 1.7版本下的并发包。
1、编写一个CalcTask.java。
package
cn.howsky.task;
import
java.util.concurrent.RecursiveTask;
public
class
CalcTask
extends
RecursiveTask<Integer> {
private
static
final
int
threshold =
100
;
private
int
fromIndex;
private
int
toIndex;
public
CalcTask(
int
fromIndex,
int
toIndex) {
this
.fromIndex = fromIndex;
this
.toIndex = toIndex;
}
/**
* jzh add 2011-12-29
*/
@Override
protected
Integer compute() {
int
total =
0
;
if
((toIndex - fromIndex) < threshold) {
for
(
int
i = fromIndex; i <= toIndex; i++) {
total += i;
}
}
else
{
int
middle = (fromIndex + toIndex) /
2
;
CalcTask leftTask =
new
CalcTask(fromIndex, middle);
CalcTask rightTask =
new
CalcTask(middle +
1
, toIndex);
// 任务分解
leftTask.fork();
rightTask.fork();
// 合并各个子任务的结果
total = leftTask.join() + rightTask.join();
}
return
total;
}
}
2、编写测试CalcTest.java。
package
cn.howsky.task;
import
java.util.concurrent.ForkJoinPool;
import
java.util.concurrent.Future;
public
class
CalcTest {
/**
* @author jzh add 2011-12-29
* @param args
*/
public
static
void
main(String[] args)
throws
Exception {
ForkJoinPool forkJoinPool =
new
ForkJoinPool();
// 递交任务,获取返回结果
Future<Integer> future = forkJoinPool.submit(
new
CalcTask(
0
,
1000
));
System.out.println(future.get());
}
3、执行结果很简单,就是输出结果集500500。如果测试机器是多cpu的可以把数值搞的大点,比如N亿次,性能才能发挥出来,普通的机器,用fork/join,数值一大,机器就卡住。
关于并发的相关文章(concurrency)。