当前位置:网站首页>Fork/Join线程池
Fork/Join线程池
2022-08-01 20:22:00 【Q z1997】
- 概念
Fork/Join 是 JDK 1.7 加入的新的线程池实现,它体现的是一种分治思想,适用于能够进行任务拆分的 cpu 密集型运算所谓的任务拆分,是将一个大任务拆分为算法上相同的小任务,直至不能拆分可以直接求解。跟递归相关的一些计算,如归并排序、斐波那契数列、都可以用分治思想进行求解
Fork/Join 在分治的基础上加入了多线程,可以把每个任务的分解和合并交给不同的线程来完成,进一步提升了运算效率
Fork/Join 默认会创建与 cpu 核心数大小相同的线程池 - 使用
提交给 Fork/Join 线程池的任务需要继承 RecursiveTask(有返回值)或 RecursiveAction(没有返回值),例如下面定义了一个对 1~n 之间的整数求和的任务
class AddTask3 extends RecursiveTask<Integer> {
private static final long serialVersionUID = -6423742051855560432L;
int begin;
int end;
public AddTask3(int begin, int end) {
this.begin = begin;
this.end = end;
}
@Override
public String toString() {
return "{" + begin + "," + end + '}';
}
@Override
protected Integer compute() {
// 5, 5
if (begin == end) {
log.debug("join() {}", begin);
return begin;
}
// 4, 5
if (end - begin == 1) {
log.debug("join() {} + {} = {}", begin, end, end + begin);
return end + begin;
}
// 1 5
int mid = (end + begin) / 2; // 3
AddTask3 t1 = new AddTask3(begin, mid); // 1,3
t1.fork();
AddTask3 t2 = new AddTask3(mid + 1, end); // 4,5
t2.fork();
log.debug("fork() {} + {} = ?", t1, t2);
int result = t1.join() + t2.join();
log.debug("join() {} + {} = {}", t1, t2, result);
return result;
}
}
使用
public static void main(String[] args) {
ForkJoinPool pool = new ForkJoinPool(4);
System.out.println(pool.invoke(new AddTask1(5)));
}

边栏推荐
- Wildcard SSL/TLS certificate
- 第56章 业务逻辑之物流/配送实体定义
- 17. Load balancing
- 【无标题】
- myid file is missing
- Ruijie switch basic configuration
- The graphic details Eureka's caching mechanism/level 3 cache
- "Torch" tensor multiplication: matmul, einsum
- Convolutional Neural Network (CNN) mnist Digit Recognition - Tensorflow
- LTE时域、频域资源
猜你喜欢
随机推荐
因斯布鲁克大学团队量子计算硬件突破了二进制
根据Uniprot ID/PDB ID批处理获取蛋白质.pdb文件
密码学的基础:X.690和对应的BER CER DER编码
第60章 ApplicationPart自动集成整体性和独立性插件项
智能硬件开发怎么做?机智云全套自助式开发工具助力高效开发
正则表达式
Interview assault 70: what is the glue bag and a bag?How to solve?
数据可视化
【Dart】dart之mixin探究
泰德制药董事长郑翔玲荣膺“2022卓越影响力企业家奖” 泰德制药荣获“企业社会责任典范奖”
有序双向链表的实现。
Remove 360's detection and modification of the default browser
KDD2022 | Self-Supervised Hypergraph Transformer Recommendation System
【多任务模型】Progressive Layered Extraction: A Novel Multi-Task Learning Model for Personalized(RecSys‘20)
面试突击70:什么是粘包和半包?怎么解决?
不同的操作加不同的锁详解
Convolutional Neural Network (CNN) mnist Digit Recognition - Tensorflow
Where should I prepare for the PMP exam in September?
Get started quickly with MongoDB
给定中序遍历和另外一种遍历方法确定一棵二叉树









