Java 并发编程(六)-Fork/Join异步回调

一、并发编程

1、Fork/Join分支合并框架

    Fork/Join它可以将一个大的任务拆分成多个子任务进行并行处理,最后将子任务结果合并成最后的计算结果,并进行输出。Fork/Join框架要完成两件事情:

    Fork:把一个复杂任务进行分拆,大事化小

    Join:把分拆任务的结果进行合并

RecursiveTask 递归任务:继承后可以实现递归(自己调自己)调用的任务。
@since 1.7public abstract class RecursiveTask<V> extends ForkJoinTask<V>RecursiveTask构造方法:
1.RecursiveTask()RecursiveTask方法:
1.protected abstract V compute():此任务执行的主要计算。
2.protected boolean exec():实现递归任务的执行约定。
3.V getRawResult():返回ForkJoinTask将返回的结果。join(),即使此任务异常完成,
或者如果未知此任务已完成,则为null。
4.protected void setRawResult(V value):强制返回给定的值作为结果。-----------------------------------------------------------------------
ForkJoinTask<V>
@since 1.7public abstract class ForkJoinTask<V> extends Object 
implements Future<V>, SerializableForkJoinTask<V>构造方法:
1.ForkJoinTask()ForkJoinTask<V>常用方法:
1.ForkJoinTask<V> fork():安排异步执行此任务。
2.V get():如有必要,等待计算完成,然后检索其结果。
3.V join():完成计算后返回计算结果。-----------------------------------------------------------------------
ForkJoinPoolpublic class ForkJoinPool extends AbstractExecutorServiceForkJoinPool构造方法:
1.ForkJoinPool()ForkJoinPool常用方法:
1.void execute(ForkJoinTask<?> task):安排(异步)执行给定任务。
2.void execute(Runnable task):在将来的某个时间执行给定的命令。
3.<T> ForkJoinTask<T> submit(Callable<T> task):提交一个返回值的任务以供执行,
并返回一个表示任务挂起结果的未来。
4.<T> ForkJoinTask<T> submit(ForkJoinTask<T> task):提交要执行的ForkJoinTask。
5.ForkJoinTask<?> submit(Runnable task):提交可运行任务以执行,并返回表示该任务的未来。
6.<T> ForkJoinTask<T> submit(Runnable task, T result):提交可运行任务以执行,
并返回表示该任务的未来。
7.void shutdown():启动有序关机,执行以前提交的任务,但不接受新任务。

 Fork/Join示例:

import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;//求1+2+3+....100。需要拆分任务不超过10个数进行相加拆分
public class ForkJoinDemo {public static void main(String[] args) throws Exception {MyTask myTask = new MyTask(0,100);//创建分支合并池对象ForkJoinPool forkJoinPool = new ForkJoinPool();ForkJoinTask<Integer> forkJoinTask = forkJoinPool.submit(myTask);//获取最终合并之后结果Integer result = forkJoinTask.get();System.out.println(result);//关闭池对象forkJoinPool.shutdown();}
}@SuppressWarnings("serial")
class MyTask extends RecursiveTask<Integer>{private static final Integer VALUE = 10;private int begin;private int end;private int result;public MyTask(int begin, int end) {this.begin = begin;this.end = end;}@Overrideprotected Integer compute() {//判断if ((end-begin) <= 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;}
}

2、CompletableFuture异步回调

同步:

异步:

CompletableFuture异步回调示例:

import java.util.concurrent.CompletableFuture;public class CompletableFutureDemo {public static void main(String[] args) throws Exception {//同步调用CompletableFuture<Void> completableFuture1 = CompletableFuture.runAsync(()->{System.out.println(Thread.currentThread().getName() + " :completableFuture1");});completableFuture1.get();//异步调用CompletableFuture<Integer> completableFuture2 = CompletableFuture.supplyAsync(()->{System.out.println(Thread.currentThread().getName() + " :completableFuture2");return 1024;});completableFuture2.whenComplete((t,u)->{System.out.println("--t--"+t);//t:表示成功的返回值System.out.println("--u--"+u);//u:表示失败异常的信息}).get();//异步调用CompletableFuture<Integer> completableFuture3 = CompletableFuture.supplyAsync(()->{System.out.println(Thread.currentThread().getName() + " :completableFuture3");//模拟异常int i = 10/0;return 1024;});completableFuture3.whenComplete((t,u)->{System.out.println("--t--"+t);//t:表示成功的返回值System.out.println("--u--"+u);//u:表示失败异常的信息}).get();}
}

实际开发中一般不会用CompletableFuture异步回调。都会使用MQ消息队列的方式。

Java 并发编程(五)-线程池

每天⽤⼼记录⼀点点。内容也许不重要,但习惯很重要!
一个程序员最重要的能力是:写出高质量的代码!!
有道无术,术尚可求也,有术无道,止于术。
无论你是年轻还是年长,所有程序员都需要记住:时刻努力学习新技术,否则就会被时代抛弃!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/228177.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BP神经网络原理,基于BP神经网络的去噪算法,基于BP神经网络的调制信号去噪

目录 BP神经网络的原理 BP神经网络的定义 BP神经网络的基本结构 BP神经网络的神经元 BP神经网络的激活函数, BP神经网络的传递函数 遗传算法原理 遗传算法主要参数 遗传算法流程图 完整代码包含数据下载链接: 基于BP神经网络的去噪算法,基于BP神经网络的调制信号去噪(代码…

下午好~ 我的论文【CV边角料】(第三期)

文章目录 CV边角料Pixel ShuffleSENetCBAMGlobal Context Block (GC)Criss-Cross Attention modules (CC) CV边角料 Pixel Shuffle Real-Time Single Image and Video Super-Resolution Using an Efficient Sub-Pixel Convolutional Neural Network pixelshuffle算法的实现流…

EXCEL SUM类函数

目录 一. SUM二. SUMIF三. SUMIFS四. SUMPRODUCT 一. SUM ⏹对一列或一组单元格中的数字进行求和。 基本语法 SUM(number1, [number2], ...)✅统计所有产品的总数量 SUM(C2:C13) 二. SUMIF ⏹按照特定条件对范围内的单元格进行求和的函数。 基本语法 SUMIF(条件区域, 指定…

山西电力市场日前价格预测【2023-12-16】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-12-16&#xff09;山西电力市场全天平均日前电价为259.00元/MWh。其中&#xff0c;最高日前电价为333.74元/MWh&#xff0c;预计出现在18:00。最低日前电价为0.00元/MWh&#xff0c;预计出…

Golang 二分查找 LEETCODE704 小记

二分查找 leetcode704 前面部分第4题&#xff0c;包括使用条件等感谢代码随想录&#xff1a;&#xff09; leetcode704 二分查找用于在有序且不重复的元素列表中寻找需要的元素&#xff0c;返回其位置或错误 当要求算法的时间复杂度在O&#xff08;logn) 等带log的复杂度时&am…

C语言训练:三个字符串比较大小,实现两个整数数的交换统计二进制中1的个数

目录 一、编写程序&#xff0c;输入三个字符串&#xff0c;比较它们的大小&#xff0c;并将它们按由小到大的顺序输出。要求用函数、指针实现。要求:要采用函数调用&#xff0c;并用指向函数的指针作为函数的参数。 1.不使用函数指针作为参数&#xff0c;并自己模拟strcmp。 …

Flume 安装与部署

目录 Flume 下载地址 &#xff08;1&#xff09;将 apache-flume-1.9.0-bin.tar.gz 上传到 linux 的 /opt/software 目录下 &#xff08;2&#xff09;解压 apache-flume-1.9.0-bin.tar.gz 到 /opt/module/ 目录下 huweihadoop101 ~]$ tar -zxvf /opt/software/apache-flume-…

001 Windows虚拟机

一、虚拟机安装Windows10 选自定义安装 升级是针对你电脑上有系统的情况下&#xff0c;你要升级&#xff1b;没有系统就选择自定义。 硬盘60G 直接单击下一步就是一个盘 如果你想对磁盘进行分区 分第一个区的时候它会去创建系统的保留分区和系统分区&#xff0c;然后还剩20…

acwing算法提高之动态规划--状态压缩DP

目录 1 基础知识2 模板3 工程化 1 基础知识 暂无。。。 2 模板 暂无。。。 3 工程化 题目1&#xff1a;小国王。 解题思路&#xff1a;状态压缩DP。 状态定义f[i][j][a]&#xff1a;表示已经考虑了前i行&#xff0c;并且摆放了j个国王&#xff0c;且第i行的状态是a的总方…

qt程序在Linux下打包的一般流程

编译 手动编写编译脚本 qmake make复制依赖库 参考文章&#xff1a; https://blog.csdn.net/JOBbaba/article/details/124289626 https://zhuanlan.zhihu.com/p/49919048 复制系统依赖库 编写复制脚本copy.sh ldd复制Qt依赖库 主要是libqxcb.so的相关依赖需要复制&…

流量分析基础

定义&#xff1a; 流量分析&#xff08;Traffic Analysis&#xff09;是指对网络流量数据进行分析和解释&#xff0c;以获得有关网络中通信的信息和情报。这种技术可以用于网络安全、网络管理和网络优化等领域。 网络流量包含了许多有关网络通信的细节信息&#xff0c;如源IP地…

Linux c++开发-06-使用Linux API 进行文件的读写

先简单的介绍一下open,read,write 先用open接口去打开文件&#xff0c;flag表示打开文件的权限不同。 int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode);示例 结果&#xff1a;

AD9361 Evaluation Software配置脚本转换工具

最近在玩一个开源的AD9361项目&#xff0c;AD9361采用纯逻辑配置&#xff0c;不需要ARM或者MicroBlaze。其中&#xff0c;先是用AD9361 Evaluation Software生成配置脚本&#xff0c;再转换成ad9361_lut.v。 在网上查了一圈&#xff0c;有个转换工具叫bit_converter&#xff0…

经典深度学习算法【1】:K-近邻算法(KNN)概述

最简单最初级的分类器是将全部的训练数据所对应的类别都记录下来&#xff0c;当测试对象的属性和某个训练对象的属性完全匹配时&#xff0c;便可以对其进行分类。但是怎么可能所有测试对象都会找到与之完全匹配的训练对象呢&#xff0c;其次就是存在一个测试对象同时与多个训练…

跟我学c++高级篇——C++26反射预览

一、c23的反射跳票 本来按照预定&#xff0c;c23中反射就应该比较全的。结果&#xff0c;由于众所周知的原因&#xff0c;线上会议肯定是不如线下会议效率高&#xff0c;那么反射这种对于c不太急切的功能&#xff08;当然&#xff0c;也有其它原因&#xff09;只能向后放一放。…

迭代器的分类

迭代器的分类&#xff1a; 这里的前置后置递增是a和a&#xff1b; 这里的前值后置递减是a--和--a&#xff1b; 各迭代器的继承关系&#xff1a; 当使用双向迭代器时&#xff0c;可以使用随机迭代器&#xff1b;

THEMIS---Beta Sprint Summary Essay Blog

Which course does this assignment belong to2301-MUSE社区-CSDN社区云What are the requirements for this assignmentbeta SprintThe goal of this assignmentTo summarize the beta task progress and the teams sprintsTeam NameThemisTop-of-the-line collection of essa…

架构师和软件架构

架构师和软件架构 引言 在今天的数字化世界中&#xff0c;软件已成为我们生活和工作的不可或缺的一部分。从简单的应用程序到复杂的系统&#xff0c;软件的设计和开发过程都需要精心的规划和管理。这里&#xff0c;软件架构的概念和软件架构师的角色就显得尤为重要。 软件架…

maui中实现加载更多 RefreshView跟ListView 跳转到详情页 传参(3)

效果如图 这里的很多数据是通过传参过来的的。 代码 例表页加入跳转功能&#xff1a; <ListView ItemsSource"{Binding Items}" ItemAppearing"OnItemAppearing" ItemTapped"OnItemTapped" RowHeight"70" Margin"20"…

visual studio 2019 移除/卸载项目已经如何再加载项目

文章目录 移除解决方案下的某个项目添加已移除的项目移除项目加载已卸载的项目注意事项 移除解决方案下的某个项目 在项目名称上&#xff0c;点击鼠标右键&#xff0c;弹出右键工具栏&#xff0c;找到 移除 功能。 然后鼠标左键点击 移除。 弹出的模态框&#xff0c;选择确定…