您的位置:首页 > 编程语言 > Java开发

java多线程的Fork/Join

2016-04-26 00:00 323 查看
JDK1.7提供了Fork/Join方式的大任务分解成小任务执行的API。

下面是一个简单实例:

计算1到1000的累加和,要求两两相加,再把各自的结果再次两两相加直到得出最后一个结果。也就是把累加的任务分成许多个两个数相加的小任务,然后再合并这些任务的计算结果。

package thread.test3;

import java.util.concurrent.RecursiveTask;

public class CountTask extends RecursiveTask<Integer>
{
private static final long serialVersionUID = 1L;

private int start,end;

private int taskSize = 2;

public CountTask(int start,int end)
{
this.start = start;
this.end = end;
}

/**
* 每个任务执行的工作
*/
@Override
protected Integer compute() {

int sum = 0;
boolean canCompute = (end - start) <= taskSize;

if(canCompute)//判断当前任务是否可以继续划分,如果不能继续划分,则开始运算
{
for(int i = start;i<= end;i++)
{
sum  = sum + i;
}
}
else {
/**
* 划分为两个任务
*/
int middle = (start + end) / 2;
CountTask task1 = new CountTask(start, middle);
CountTask task2 = new CountTask(middle + 1, end);

task1.fork();//开始执行
task2.fork();//开始执行

//获得一个子任务的结果,如果得不到结果,此线程就不会往下继续执行
int task1Result = task1.join();
int task2Result = task2.join();

sum = task1Result + task2Result;//合并子任务的结果
}
return sum;
}

}


主函数:

package thread.test3;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.Future;

public class Test {

public static void main(String[] args) throws Exception, ExecutionException {

ForkJoinPool forkJoinPool = new ForkJoinPool();//线程池

CountTask task = new CountTask(1, 1000);

Future<Integer> result = forkJoinPool.submit(task);

System.out.println("1 - 1000的累加结果是:"+result.get());
System.out.println("主线程结束...");

}

}


运行结果:

1 - 1000的累加结果是:5050
主线程结束...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java