当前位置:网站首页>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)));
}
边栏推荐
- 58:第五章:开发admin管理服务:11:开发【管理员人脸登录,接口】;(未实测)(使用了阿里AI人脸识别)(演示了,使用RestTemplate实现接口调用接口;)
- WhatsApp群发实战分享——WhatsApp Business API账号
- Wildcard SSL/TLS certificate
- nacos安装与配置
- 我的驾照考试笔记(3)
- 【节能学院】智能操控装置在高压开关柜的应用
- 【kali-信息收集】(1.5)系统指纹识别:Nmap、p0f
- 部署zabbix
- Interview assault 70: what is the glue bag and a bag?How to solve?
- 【七夕特别篇】七夕已至,让爱闪耀
猜你喜欢
】 【 nn. The Parameter () to generate and why do you want to initialize
智能硬件开发怎么做?机智云全套自助式开发工具助力高效开发
我的驾照考试笔记(2)
因斯布鲁克大学团队量子计算硬件突破了二进制
第57章 业务逻辑之业务实体与数据库表的映射规则定义
【社媒营销】如何知道自己的WhatsApp是否被屏蔽了?
idea插件generateAllSetMethod一键生成set/get方法以及bean对象转换
Acrel-5010重点用能单位能耗在线监测系统在湖南三立集团的应用
【kali-信息收集】(1.4)识别活跃的主机/查看打开的端口:Nmap(网络映射器工具)
【多任务优化】DWA、DTP、Gradnorm(CVPR 2019、ECCV 2018、 ICML 2018)
随机推荐
Batch get protein .pdb files based on Uniprot ID/PDB ID
Get started quickly with MongoDB
Software you should know as a programmer
regular expression
1个小时!从零制作一个! AI图片识别WEB应用!
Addition, Subtraction, Multiplication of Large Integers, Multiplication and Division of Large Integers and Ordinary Integers
【节能学院】安科瑞餐饮油烟监测云平台助力大气污染攻坚战
deploy zabbix
【kali-信息收集】(1.2)SNMP枚举:Snmpwalk、Snmpcheck;SMTP枚举:smtp-user-enum
58: Chapter 5: Develop admin management services: 11: Develop [admin face login, interface]; (not measured) (using Ali AI face recognition) (demonstrated, using RestTemplate to implement interface cal
LabVIEW 使用VISA Close真的关闭COM口了吗
Determine a binary tree given inorder traversal and another traversal method
nacos安装与配置
30天刷题计划(五)
【社媒营销】如何知道自己的WhatsApp是否被屏蔽了?
解除360对默认浏览器的检测与修改
Acrel-5010重点用能单位能耗在线监测系统在湖南三立集团的应用
Failed to re-init queues : Illegal queue capacity setting (abs-capacity=0.6) > (abs-maximum-capacity
泰德制药董事长郑翔玲荣膺“2022卓越影响力企业家奖” 泰德制药荣获“企业社会责任典范奖”
模板特例化和常用用法