分支合并框架 (ForkJoin)
Fork:把一个复杂任务进行分拆。
Join:把分拆任务的结果进行合并。
ForkJoinPool 相当于线程池、ForkJoinTask 相当于 FutureTask、RecursiveTask 继承了ForkJoinTask
/**
* @author phd
* @version 1.0
* @date 2020/9/3
* 并发计算1-100的和
*
*
*/
class MyTask extends RecursiveTask<Integer>{
private static final Integer ADJUST_VALUE = 10;
private int begin;
private int end ;
private int result;
MyTask(int begin,int end){
this.begin = begin;
this.end = end;
}
@Override
protected Integer compute() {
if(end - begin <= ADJUST_VALUE){
for (int i = begin; i <= end ; i++) {
result = result + i;
}
}else {
int middle = (begin + end)/2;
MyTask task01 = new MyTask(begin,middle);
MyTask task02 = new MyTask(middle+1,end);
task01.fork();
task02.fork();
result = task01.join()+task02.join();
}
return result;
}
}
public class ForkJoinDemo {
public static void main(String args[]) throws ExecutionException, InterruptedException {
MyTask myTask = new MyTask(0,100);
ForkJoinPool forkJoinPool = new ForkJoinPool() ;
ForkJoinTask<Integer> forkJoinTask = forkJoinPool.submit(myTask);
System.out.println(forkJoinTask.get());
forkJoinPool.shutdown();
// ForkJoinTask forkJoinTask ;
// RecursiveTask recursiveTask ;
}
}
异步回调(CompletableFuture)
public class CompletetableFutureDemo {
public static void main(String args[]){
CompletableFuture<Void> completableFuture = CompletableFuture.runAsync(() -> {
System.out.println(Thread.currentThread().getName()+" 没有返回");
});
// 异步回调
CompletableFuture<Integer> IntCompletableFuture = CompletableFuture.supplyAsync(() ->{
System.out.println(Thread.currentThread().getName()+"有返回");
// int age = 10/0;
return 1024;
});
try {
System.out.println(
IntCompletableFuture.whenComplete((t,u) ->{
System.out.println("-------t "+t);
System.out.println("-------u "+u);
}).exceptionally(f -> {
System.out.println("-------exception"+f.getMessage());
return 404;
}).get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}