当前位置: 首页 > news >正文

第三百二十五节 Java线程教程 - Java Fork/Join框架

Java线程教程 - Java Fork/Join框架

fork/join框架通过利用机器上的多个处理器或多个内核来解决问题。

该框架有助于解决涉及并行性的问题。

fork/join框架创建一个线程池来执行子任务。

当线程在子任务上等待完成时,框架使用该线程来执行其他线程的其他未决子任务。

java.util.concurrent包中的以下四个类是学习fork/join框架的核心:

  • ForkJoinPool
  • ForkJoinTask
  • RecursiveAction
  • RecursiveTask

ForkJoinPool类的一个实例表示一个线程池。 ForkJoinTask类的一个实例表示一个任务。

ForkJoinTask类是一个抽象类。它有两个具体的子类:RecursiveAction和RecursiveTask。

Java 8添加了一个称为CountedCompleter的ForkJoinTask类的抽象子类。

该框架支持两种类型的任务:不产生结果的任务和产生结果的任务。

RecursiveAction类的实例表示不产生结果的任务。 RecursiveTask类的实例表示产生结果的任务。

CountedCompleter任务可能产生结果,也可能不产生结果。

这两个类,RecursiveAction和RecursiveTask,提供了一个抽象的compute()方法。

我们应该继承这些类之一,并为compute()方法提供一个实现。

例子

ForkJoinTask类的以下两个方法在任务执行期间提供了两个重要的功能:

fork()方法从异步执行的任务启动一个新的子任务。join()方法让任务等待另一个任务完成。

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;public class Main {public static void main(String[] args) {ForkJoinPool pool = new ForkJoinPool();IntSum task = new IntSum(3);long sum = pool.invoke(task);System.out.println("Sum is " + sum);}
}class IntSum extends RecursiveTask<Long> {private int count;public IntSum(int count) {this.count = count;}@Overrideprotected Long compute() {long result = 0;if (this.count <= 0) {return 0L; }else if (this.count == 1) {return (long) this.getRandomInteger();}List<RecursiveTask<Long>> forks = new ArrayList<>();for (int i = 0; i < this.count; i++) {IntSum subTask = new IntSum(1);subTask.fork(); // Launch the subtaskforks.add(subTask);}// all subtasks finish and combine the resultfor (RecursiveTask<Long> subTask : forks) {result = result + subTask.join();}return result;}public int getRandomInteger() {return 2;}
}

上面的代码生成以下结果。


 

http://www.lryc.cn/news/484871.html

相关文章:

  • 网络游戏安全现状及相关应对方案
  • uniapp h5地址前端重定向跳转
  • uniapp隐藏自带的tabBar
  • 使用--log-file保存pytest的运行日志
  • WebAPI性能监控-MiniProfiler与Swagger集成
  • 视频会议接入GB28181视频指挥调度,语音对讲方案
  • 深度学习和图像处理
  • 〔 MySQL 〕数据类型
  • 云安全之云计算基础
  • PostgreSQL pg-xact(clog)目录文件缺失处理
  • 《ElementPlus 与 ElementUI 差异集合》Icon 图标 More 差异说明
  • 基于碎纸片的拼接复原算法及MATLAB实现
  • 苍穹外卖 软件开发流程
  • mysqldump导出表结构和表数据和存储过程和函数
  • 常见的排序算法及分类对比
  • 多窗口切换——selenium
  • LFD STM32编程规范20241111
  • Python学习------第八天
  • 【扩散——BFS】
  • C++ 编程基础(5)类与对象 | 5.5、多态
  • 客户端发送http请求进行流量控制
  • STM32 低功耗模式详解
  • 我的第一个PyQt5程序
  • Unity调用Python
  • 前端,location.reload刷新页面
  • 5G的发展演进
  • 数据库参数备份
  • PG数据库 数据库时间字段 开始时间和结束时间,判断和查询条件的开始和截止时间存在交集,SQL如何编写
  • k8s服务内容滚动升级以及常用命令介绍
  • 机器学习: LightGBM模型(优化版)——高效且强大的树形模型