JUC(七)分支合并框架
JUC分支合并框架
简介
Fork/Join可以将一个大的任务拆分成多个子任务进行并行处理,最后将子任务的结果合并称为最终的计算结果。
- Fork:负责将任务拆分
- Join:合并拆分任务
- ForkJoinPool:分支合并池,添加分支合并任务,使用get得到计算结果

案例一:实现1+...+100,要求计算过程不能有相差超过10的数字的相加
class MyTask extends RecursiveTask<Integer> {
private final Integer VALUE = 10;
private Integer begin;
private Integer end;
MyTask(int begin, int end) {
this.begin = begin;
this.end = end;
}
@Override
public Integer compute() {
int result = 0;
if(end - begin >= VALUE) {
int mid = (end + begin) / 2;
MyTask myTask1 = new MyTask(begin, mid);
MyTask myTask2 = new MyTask(mid + 1, end);
myTask1.fork();
myTask2.fork();
result += myTask1.join() + myTask2.join();
} else {
for(int i = begin; i <= end; i++) {
result += i;
}
}
return result;
}
}
public class ForkJoinTaskDemo {
public static void main(String[] args) throws ExecutionException, InterruptedException {
MyTask task = new MyTask(1, 100);
ForkJoinPool forkJoinPool = new ForkJoinPool();
ForkJoinTask<Integer> submit = forkJoinPool.submit(task);
Integer integer = submit.get();
forkJoinPool.shutdown();
System.out.println(integer);
}
}
案例二:实现分支计算斐波那契数列
class Fi extends RecursiveTask<Integer>{
private final int n;
Fi(int n) {
this.n = n;
}
@Override
protected Integer compute() {
if(n == 0 || n ==1) {
return 1;
}
Fi f1 = new Fi(n-1);
Fi f2 = new Fi(n-2);
f1.fork();
f2.fork();
return f1.join() + f2.join();
}
}
public class ForkJoinTaskDemo {
public static void main(String[] args) throws ExecutionException, InterruptedException {
Fi fi = new Fi(5);
ForkJoinPool pool = new ForkJoinPool();
Integer integer = pool.submit(fi).get();
System.out.println(integer);
}
}
JUC CompletableFuture异步回调

两个异步方法:
- CompletableFuture.runAsync:不带返回值的异步方法
- CompletableFuture.supplyAsync:携带返回值的异步方法
public static CompletableFuture<Void> runAsync(Runnable runnable) {
return asyncRunStage(ASYNC_POOL, runnable);
}
/**
* Returns a new CompletableFuture that is asynchronously completed
* by a task running in the given executor after it runs the given
* action.
*
* @param runnable the action to run before completing the
* returned CompletableFuture
* @param executor the executor to use for asynchronous execution
* @return the new CompletableFuture
*/
public static CompletableFuture<Void> runAsync(Runnable runnable,
Executor executor) {
return asyncRunStage(screenExecutor(executor), runnable);
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
CompletableFuture<Void> future1 = CompletableFuture.runAsync(() -> {
System.out.println(Thread.currentThread().getName());
});
future1.get();
CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> {
System.out.println(Thread.currentThread().getName());
int i = 1 / 0;
return 1024;
});
future2.whenComplete((t, u) -> {
System.out.println(t);
System.out.println(u);
});
}
whenComplete获取返回值的时候,第一个参数为值,第二个参数为异步产生的异常
ForkJoinPool.commonPool-worker-1
ForkJoinPool.commonPool-worker-1
null
java.util.concurrent.CompletionException: java.lang.ArithmeticException: / by zero
JUC(七)分支合并框架的更多相关文章
- ForkJoinPool 分支/合并框架
ForkJoinPool 分支/合并框架 一.Fork/Join框架简介 Fork/Join 框架就是在必要的情况下,将一个大任务,进行拆分(fork)成若干个小任务(拆到不可再拆时),再将一个个的小 ...
- 11.ForkJoinPool 分支/合并框架 (工作窃取)
/*ForkJoinPool 分支/合并框架 (工作窃取)*/ Fork/Join 框架:就是在必要的情况下,将一个大任务,进行拆分(fork) 成若干个小任务(拆到给出的临界值为止),再将一个个的小 ...
- ForkJoinPool分支合并框架-工作窃取
Fork/Join 框架 Fork/Join 框架:就是在必要的情况下,将一个大任务,进行拆分(fork)成 若干个小任务(拆到不可再拆时), 再将一个个的小任务运算的结果进行 join 汇总 For ...
- java多线程 -- ForkJoinPool 分支/ 合并框架 工作窃取
Fork/Join 框架:就是在必要的情况下,将一个大任务,进行拆分(fork)成若干个小任务(拆到不可再拆时),再将一个个的小任务运算的结果进行 join 汇总. Fork/Join 框架与线程池的 ...
- ForkJoinPool分支/合并框架工程使用的工作窃取
ForkJoinPool分支/合并框架 在必要的情况下,讲一个大任务,进行拆分(fork)成若干个小任务(拆到不可拆为止),再将一个个小的任务运算的结果进行join汇总. 工作窃取的背景 分支/合并框 ...
- eclipse svn 分支合并到主干
最近公司产品上线,整个系统架构包含有七八个子系统,并且子系统都是集群部署.所以每次升级维护都要确保尽可能不出问题.因为整个系统刚上线不久,意味着新系统不定期有BUG需修复,但新功能模块也在持续的开发中 ...
- eclipse 上Svn将项目从分支合并到主干的方法
eclipse svn 分支合并到主干 最近公司产品上线,整个系统架构包含有七八个子系统,并且子系统都是集群部署.所以每次升级维护都要确保尽可能不出问题.因为整个系统刚上线不久,意味着新系统不定期 ...
- Java多线程系列--“JUC锁”01之 框架
本章,我们介绍锁的架构:后面的章节将会对它们逐个进行分析介绍.目录如下:01. Java多线程系列--“JUC锁”01之 框架02. Java多线程系列--“JUC锁”02之 互斥锁Reentrant ...
- 分支合并git checkout adview git merge adview3
分支合并 git checkout adview git merge adview3
- (转)SVN分支/合并原理及最佳实践
先说说什么是branch.按照Subversion的说法,一个branch是某个development line(通常是主线也即trunk)的一个拷贝,见下图: branch存在的意义在于,在不干扰t ...
随机推荐
- Web_Servlet之间请求转发
Servlet2 @WebServlet(urlPatterns = "/aa") public class JspService extends HttpServlet { pr ...
- vscode配置c++环境(超简单)
vscode配置c++环境(超简单) 超简单!!! 配置c++最麻烦的就是mingw的环境,有很多不同的版本,很杂乱,这里我们用最简单的办法展示. 下载一个devc++. 如果你问我,为什么下了dev ...
- 将成员服务器ms1加到AD域中
1.对ms1的ipv4设置,dns对应地址dc1服务器地址 2.修改计算机名,并加入域 重启后 2.以域用户登录方式有两种 1. 2. 检查ms1有没有加入dc1的域中 在dc1
- Use `tensor.item()` in Python or `tensor.item<T>()` in C++ to convert a 0-dim tensor to a number
IndexError: invalid index of a 0-dim tensor. Use `tensor.item()` in Python or `tensor.item<T>( ...
- 微信小程序中如何设置跳转页面
修改project.config.json内容 "cloudfunctionRoot":"cloud", //配置云开发的路径 更改app.js文件内容 App ...
- [vue2 + jointjs + svg-pan-zoom] 节点自动布局渲染 + 拖拽缩放
启动vue项目,执行以下命令安装dagre.graphlib.jointjs.svg-pan-zoom. npm install dagre graphlib jointjs svg-pan-zoom ...
- MySQL视频学习 1-18小节
地址:https://www.bilibili.com/video/av39807944/?p=16 1-15:撘环境.建表.数据类型(https://www.runoob.com/mysql/mys ...
- markdown空格缩进以及HTML空格实体
参考链接:https://www.jianshu.com/p/31eade263e7a https://www.cnblogs.com/naixil/p/13193364.html
- 自己动手从零写桌面操作系统GrapeOS系列教程——17.用汇编语言清空屏幕
学习操作系统原理最好的方法是自己写一个简单的操作系统. 在QEMU中会默认输出一些字符,有时候会干扰我们自己输出的字符.一个比较好的办法是向将屏幕清空,再输出我们想要输出的字符.下面就来学习如何清空屏 ...
- python + BeautifulSoup + selenium 实现爬取中医智库的古籍分类的数据
爬取内容为 该图片下的七个分类, 然后对应的每个种类的书本信息(摘要和目录) 效果为 代码如下 import requests from bs4 import BeautifulSoup import ...