【Java】Java中J.U.C扩展组件之Fork,join
Fork/join
介绍
- 任务只能使用Fork、Join操作来作为同步机制,如果使用了其他同步机制,那他们在同步操作时,工作线程则不能执行其他任务。如:在框架的操作中,使任务进入睡眠,那么在这个睡眠期间内,正在执行这个任务的工作线程,将不会执行其他任务
- 所执行的任务,不应该执行IO操作,如读和写数据文件
- 任务不能抛出检查型异常,必须通过必要的代码处理它们
Fork/join
代码演示
package com.rumenz.task;import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;
public class ForkJoinExample extends RecursiveTask<Integer> {
public final static int threshold=2;
private int start;
private int end;
public ForkJoinExample(int start, int end) {
this.start = start;
this.end = end;
}
@Override
protected Integer compute() {
int sum=0;
boolean b = (end - start) <= threshold;
if(b){
//任务足够小的时候,直接计算,不进行分裂计算
for (int i = start; i <=end ; i++) {
sum+=i;
}
}else{
int mid=(start+end)/2;
//继续分裂任务
ForkJoinExample task1=new ForkJoinExample(start,mid);
ForkJoinExample task2=new ForkJoinExample(mid+1,end);
// 执行子任务
task1.fork();
task2.fork();
// 等待任务执行结束合并其结果
Integer m = task1.join();
Integer n = task2.join();
sum=m+n;
}
return sum;
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
//生成一个池
ForkJoinPool forkJoinPool=new ForkJoinPool();
ForkJoinTask task=new ForkJoinExample(1, 100000);
ForkJoinTask<Integer> submit = forkJoinPool.submit(task);
Integer sum = submit.get();
System.out.println("最后的结果是:"+sum);
}
}
关注微信公众号:【入门小站】,解锁更多知识点
以上是 【Java】Java中J.U.C扩展组件之Fork,join 的全部内容, 来源链接: utcz.com/a/103644.html