自定义封装异步任务组件,实现FutureTask功能
- FutureTask
在 JDK1.8 后的异步编排API中的CompletableFuture,提供了 异步任务的成功回调、异常回调。
public class FutureTaskTest {public static void main(String[] args) throws Exception {CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}return UUID.randomUUID().toString();});future.thenAccept((s) -> {System.out.println("异步任务的返回值" + s);});future.exceptionally((ex) -> {ex.printStackTrace();return null;});Thread.sleep(5000);}}
启动一个异步任务后,就相当于启动了一个线程,给这个异步对象设置回调方法,那么当异步任务运行结束或者出现异常时会自动调用相关的回调。
- 自定义AsyncTask实现 异步任务回调
public class AsyncTest {public static void main(String[] args) throws Exception {AsyncTask<String> asyncTask = new AsyncTask<>(new Callable<String>() {@Overridepublic String call() throws Exception {System.out.println("开始处理数据");Thread.sleep(3000);String s = UUID.randomUUID().toString();System.out.println("数据计算完成");return s;}});asyncTask.run();Thread.sleep(5000);asyncTask.thenError((ex) -> {ex.printStackTrace();});asyncTask.thenSuccess((s) -> {System.out.println("任务数据:" + s);});System.out.println("主线程结束");}}class AsyncTask<T>{private Callable<T> task;private T value;private Exception e;private Consumer<T> successConsumer;private Consumer<? super Exception> exConsumer;private Thread thread;public AsyncTask(Callable<T> task){this.task = task;}public void run(){this.thread = new Thread(() -> {try {value = task.call();if (successConsumer != null){successConsumer.accept(value);}} catch (Exception e) {this.e = e;if (exConsumer != null){exConsumer.accept(e);}}});this.thread.start();}public void thenSuccess(Consumer<T> consumer){this.successConsumer = consumer;if (this.thread != null && !this.thread.isAlive() && e == null){consumer.accept(value);}}public void thenError(Consumer<? super Exception> consumer){this.exConsumer = consumer;if (this.thread != null && !this.thread.isAlive() && e != null){consumer.accept(e);}}}
异步任务回调 就是想让线程运行完成后执行其他线程设置的回调方法。
这里通过 thenSuccess 设置异步线程的回调方法 ,然后通过以下代码去判断是否已经设置了异步回调。
if (successConsumer != null){successConsumer.accept(value);}
这里还有一个问题,主线程是先调用了run方法,再调用了thenSuccess方法,如果run方法和thenSuccess方法之前的执行时间超过了异步任务的执行时间。
避免这种问题的解决办法有2中。
-
在run之前先调用thenError 、thenSuccess 设置好回调后,再调用run。
由于在开启线程之前就已经设置好回调了,自然不用担心。 -
在thenError、thenSuccess 方法内判断线程的状态,如果线程的isAlive方法返回false,则说明线程已经运行完了,在运行中的线程状态是true,所以,将线程的返回值以及异常保存起来,在调用 thenError、thenSuccess 方法 时,判断线程如果运行完成(调用了start方法的线程状态会是true),这个时候说明还没有执行回调,则拿到返回值后调用回调方法即可。
if (this.thread != null && !this.thread.isAlive() && e == null){consumer.accept(value);}
- 泛型
关于泛型的理解,泛型类可以想象成一个翁,翁就是一个容器,可以装各种各样的东西,每个翁都是如此,但是为了方便装的东西后续可以快速找到,就给每一个翁贴上一个标签,例如第一个翁只装钥匙,第二个翁只装杯子等等,这样从翁中拿出来的时候也只会是放进入的东西。泛型就相当于翁的一个标签,标识着此翁装配的东西,
一个翁也就是是带泛型的Java对象,在当作参数传递的过程中翁上的标签也是会传递的,Java编译器会自动检查带泛型的对象返回的类型以及当作参数传入的对象类型,例如 stream的map方法在使用lambda返回时 会自动推断返回值类型,如果接受的类型不匹配,编译器会报错,再比如使用lambda表达式定义入参时,无需指定参数类型,如果泛型类型是String类型,那就调不了其他类的方法,这也是有编译器保证的,这就是泛型的自动推断和传递。
有的实例方法需要的参数也是带着泛型的,例如AsyncTask中的
public void thenSuccess(Consumer<T> consumer){this.successConsumer = consumer;if (this.thread != null && !this.thread.isAlive() && e == null){consumer.accept(value);}}public void thenError(Consumer<? super Exception> consumer){this.exConsumer = consumer;if (this.thread != null && !this.thread.isAlive() && e != null){consumer.accept(e);}}
例如thenSuccess 方法需要一个Consumer 实例,而这个实例也是需要带标签的,那这个标签是什么呢?就是取决于当前对象的标签,例如我有一个翁,标签是 钥匙,那我需要一个处置东西的工具、而这个处置东西的工具也可以打标签,例如可以处置杯子、处置木头、处置钥匙等,那这个地方的意思就是我需要一个Consumer类型的对象,这个对象的标签是T,而T是哪里来的,T是在创建当前对象的时候定义好的,也就是类似常说的出厂设置,这个实例在创建的时候就知道自己的泛型,即 某个翁在制造好出厂的时候就打好标签了。那自然 此对象在当作参数传递时,编译器也会自动检查标签是否与某个方法参数相匹配等等。
相关文章:
![](https://img-blog.csdnimg.cn/03609ccbc954484395a4c7f35f1950d6.png)
自定义封装异步任务组件,实现FutureTask功能
FutureTask 在 JDK1.8 后的异步编排API中的CompletableFuture,提供了 异步任务的成功回调、异常回调。 public class FutureTaskTest {public static void main(String[] args) throws Exception {CompletableFuture<String> future CompletableFuture.sup…...
![](https://img-blog.csdnimg.cn/img_convert/0a89e74c9dc709ba6e79d73a3dfaad4c.webp?x-oss-process=image/format,png)
【区块链 | IPFS】IPFS节点搭建、文件上传、节点存储空间设置、节点上传文件chunk设置
一、创建ipfs节点 通过ipfs init在本地计算机建立一个IPFS节点 本文有些命令已经执行过了,就没有重新初始化。部分图片拷贝自先前文档,具体信息应以实物为准 ipfs init initializing IPFS node at /Users/CHY/.ipfs generating 2048-bit RSA keypair.…...
![](https://img-blog.csdnimg.cn/2d889d11324b4edeab1584654afb4969.png)
【autodesk】浏览器中渲染rvt模型
使用Forge完成渲染 Forge是什么 为什么能够渲染出来rvt模型 Forge是由Autodesk开发的一套云端开发平台和工具集。在Forge平台中,有一个名为"Model Derivative"的服务,它可以将包括RVT(Revit)在内的多种BIM(…...
![](https://img-blog.csdnimg.cn/7753166dbb4345698e96a92212bc612e.jpeg)
Python超入门(1)__迅速上手操作掌握Python
# 1.第一个代码:输出语句 # 1.第一个代码:输出语句 print("My dogs name is Huppy!") print(o----) print( ||| ) print("*" * 10) """ 输出结果: My dogs name is Huppy! o----||| ********** "&…...
![](https://www.ngui.cc/images/no-images.jpg)
后端面试话术集锦第 十四 篇:go语言面试话术
这是后端面试集锦第十四篇博文——go语言面试话术❗❗❗ 1. go数组、切片、扩容 go的数组和切片都是用来存储相同类型的数据集合。 数组是存储固定大小的集合,且为值引用。 但切片是存储无固定大小的集合,且为引用类型。 切片有三个属性,分别为指向指针的数组array,数组…...
![](https://www.ngui.cc/images/no-images.jpg)
Oralce集群管理-19C RAC 私有网络调整为BOND1
1 尝试在线添加私有网络的新接口 是否成功。 使用oifcfg命令在线添加新的网卡接口,在还没有配置bond1的条件下 也是可以添加成功的。 [gridorcldb1 ~]$ oifcfg getif eno3 192.168.224.0 global public ens3f0 10.2.0.0 global cluster_interconnect,asm eno…...
洛谷 Array 数论
题目: 对于长度为n的数组A,A中只包含从1到n的整数(可重复)。如果A单调不上升或单调不下降,A就可称为美丽的。 找出在长度为n时,有几个美丽的A。 思路: 这是一道数论题。 我们先找找“单调不递…...
![](https://img-blog.csdnimg.cn/10bec875de56446b84753ee69dda3b1c.png)
简明SQL条件查询指南:掌握WHERE实现数据筛选
条件查询是用于从数据库中根据特定条件筛选数据行的一种方式,它避免了检索整个表中的数据。通常,使用 WHERE 子句来定义过滤条件,只有符合这些条件的数据行才会被返回。 SQL中的运算符有:、!、<、> 等,用于进行…...
![](https://www.ngui.cc/images/no-images.jpg)
通过HbaseClient来写Phoenix表实现
由于数据存储在Hbase上,并且上层使用了Phoenix来读写数据。并且由于数据的列字段不固定,并且可能由于Hbase表列和Phoenix的表列字段不一致,使用Phoenix写入的数据会导致写出报错的问题出现。所以这里直接使用HbaseClient写入到Hbase表中&…...
![](https://www.ngui.cc/images/no-images.jpg)
uniapp qiun charts H5使用echarts的eopts配置不生效
原因是:使用web的要设置 echartsH5 :echartsH5"true" <template><view class"charts-box"><view class"chart-title"> 趋势</view><qiun-data-chartstype"column":eopts"eopts":cha…...
![](https://img-blog.csdnimg.cn/c0ad96e39b6c40d9b06931825edc4f99.png)
嵌入式Linux驱动开发(LCD屏幕专题)(三)
1. 硬件相关的操作 LCD驱动程序的核心就是: 分配fb_info设置fb_info注册fb_info硬件相关的设置 硬件相关的设置又可以分为3部分: 引脚设置时钟设置LCD控制器设置 2. 在设备树里指定LCD参数 framebuffer-mylcd {compatible "100ask,lcd_drv&qu…...
![](https://img-blog.csdnimg.cn/img_convert/29281dd864040aaffa62329dd032a904.png)
MySQL视图用户管理
文章目录 视图视图的规则用户用户信息创建用户删除用户修改密码 用户权限给用户授权回收权限 视图 视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表,基表的数据变化也会…...
![](https://img-blog.csdnimg.cn/92550d30630849b2a13412a7cc8a6ea3.png)
我发现了一个很好看的字体,霞鹜文楷!如何换windows和typora字体?
1、字体 官方地址如下,下载也很简单。 https://github.com/lxgw/LxgwWenKai 有1W多的stars。 方式: 直接打包下载。下载不来,可以联系我。 然后ttf的文件,全部安装就行了。 reg save "HKCU\Control Panel" .\res…...
![](https://img-blog.csdnimg.cn/img_convert/21d39bc46c65f119904ffead5b9bbca8.jpeg)
微软8月系统更新引发问题:虚拟内存分页文件出现错误
微软的八月系统更新引发了一系列问题,其中包括“UNSUPPORTED_PROCESSOR”蓝屏错误和文件管理器故障。尽管微软已经修复了前者,但据国外科技媒体Windows Latest报道,仍有用户反馈在非微星设备上出现“fault in nonpaged area”蓝屏错误。 如果…...
![](https://img-blog.csdnimg.cn/img_convert/10f10b5727e3bd10fd7978634f610949.png)
swiper删除虚拟slide问题
在存在缓存的情况下,删除较前的slide,会出现当前slide与后一个slide重复出现的情况 假设当前存在5个slide,且这5个slide已缓存,则删除slide2后,仍为5个slide,且slide2的内容变为slide3的内容,此…...
![](https://img-blog.csdnimg.cn/d9452fbe2eed46979b8410d170f94aac.png)
FPGA实战小项目2
基于FPGA的贪吃蛇游戏 基于FPGA的贪吃蛇游戏 基于fpga的数字密码锁ego1 基于fpga的数字密码锁ego1 基于fpga的数字时钟 basys3 基于fpga的数字时钟 basys3...
![](https://www.ngui.cc/images/no-images.jpg)
一些关于完整小程序项目的优秀开源
转载自: 35个项目,开源,开源! (qq.com) 那几本霸占我休息时间的PDF! (qq.com) 13个超强的 SpringBoot 实战项目 (还不赶紧收藏起来) (qq.com) 用SpringBoot开发一个人脸识别系统!…...
![](https://img-blog.csdnimg.cn/7c8a0f06dc644b368fe72292a2aa4e19.png)
Windows模拟器推荐
物是人非事事休,欲语泪先流 Windows模拟器推荐 如果你需要在 Windows 操作系统之外运行 Windows 应用程序或测试不同版本的 Windows,有几个 Windows 模拟器和虚拟机软件可供选择。以下是一些常用的 Windows 模拟器和虚拟机软件: VirtualBox&…...
![](https://img-blog.csdnimg.cn/3a01dc60e62c415b812015851343f1c0.png#pic_center)
搭建RabbitMQ消息服务,整合SpringBoot实现收发消息
作者主页:Designer 小郑 作者简介:3年JAVA全栈开发经验,专注JAVA技术、系统定制、远程指导,致力于企业数字化转型,CSDN博客专家,蓝桥云课认证讲师。 目录 一、前言1.1 什么是消息队列1.2 RabbitMQ 是什么1.…...
![](https://img-blog.csdnimg.cn/9312a9ffb1164dc6bd7622d97934f702.png)
Web framework-Gin(二)
目录 一、Gin 1、Ajax 2、文件上传 2.1、form表单中文件上传(单个文件) 2.2、form表单中文件上传(多个文件) 2.3、ajax上传单个文件 2.4、ajax上传多个文件 3、模板语法 4、数据绑定 5、路由组 6、中间件 一、Gin 1、Ajax AJAX 即“Asynchronous Javascript And XM…...
![](https://img-blog.csdnimg.cn/3f3044efc49d4972ad276cfff3de2afd.png)
【聚类】K-Means聚类
cluster:簇 原理: 这边暂时没有时间具体介绍kmeans聚类的原理。简单来说,就是首先初始化k个簇心;然后计算所有点到簇心的欧式距离,对一个点来说,距离最短就属于那个簇;然后更新不同簇的簇心&a…...
![](https://img-blog.csdnimg.cn/img_convert/cf9973dd1206edeae99010f28dc50815.png)
超图聚类论文阅读2:Last-step算法
超图聚类论文阅读2:Last-step算法 《使用超图模块化的社区检测算法》 《Community Detection Algorithm Using Hypergraph Modularity》 COMPLEX NETWORKS 2021, SCI 3区 具体实现源码见HyperNetX库 工作:提出了一种用于超图的社区检测算法。该算法的主要…...
![](https://www.ngui.cc/images/no-images.jpg)
React 防抖与节流用法
在React中,防抖和节流是优化性能和提升用户体验的常用技术。下面是它们的用法: 防抖(Debounce):防抖是指在某个事件触发后,等待一段时间后执行回调函数。如果在等待时间内再次触发该事件,将重新…...
![](https://img-blog.csdnimg.cn/cdc256e784064e38ae8a1250cabf4db7.png#pic_center)
发布 VectorTraits v1.0,它是 C# 下增强SIMD向量运算的类库
发布 VectorTraits v1.0, 它是C#下增强SIMD向量运算的类库 VectorTraits: SIMD Vector type traits methods (SIMD向量类型的特征方法). NuGet: https://www.nuget.org/packages/VectorTraits/1.0.0 源代码: https://github.com/zyl910/VectorTraits 用途 总所周知&#x…...
![](https://img-blog.csdnimg.cn/5a11cf71b5d8460983868f653f2d15a2.png)
HCIA自学笔记01-冲突域
共享式网络(用同一根同轴电缆通信)中可能会出现信号冲突现象。 如图是一个10BASE5以太网,每个主机都是用同一根同轴电缆来与其它主机进行通信,因此,这里的同轴电缆又被称为共享介质,相应的网络被称为共享介…...
![](https://img-blog.csdnimg.cn/eec26648339c4459bc33a89ccae81a74.png)
3D封装技术发展
长期以来,芯片制程微缩技术一直驱动着摩尔定律的延续。从1987年的1um制程到2015年的14nm制程,芯片制程迭代速度一直遵循摩尔定律的规律,即芯片上可以容纳的晶体管数目在大约每经过18个月到24个月便会增加一倍。但2015年以后,芯片制…...
![](https://www.ngui.cc/images/no-images.jpg)
探讨下live555用的编程设计模式
这个应该放到这里 7.live555mediaserver-第1阶段小结(完整对象图和思维导图) https://blog.csdn.net/yhb1206/article/details/127330771 但是想想,还是拿出来吧。 从这第1阶段就能发现,它实质用到了reactor网络编程模式。...
![](https://img-blog.csdnimg.cn/img_convert/80f44ef5bd4b0cccd11870c55d82e650.png)
LeetCode 1123. Lowest Common Ancestor of Deepest Leaves【树,DFS,BFS,哈希表】1607
本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…...
![](https://img-blog.csdnimg.cn/a79c0073360b4f67a0eca18a207a56ea.png)
centroen 23版本换界面了
旧版本 新版本 没有与操作系统一起打包的ISO文件了,要么先安装系统,再安装Centreon,要么用pve导入OVF文件...
![](https://www.ngui.cc/images/no-images.jpg)
Postman 调用 Microsoft Graph API (InsCode AI 创作助手)
官方配置参考网址: https://learn.microsoft.com/zh-cn/graph/use-postman 获取 Azure AD 应用程序凭据: 在 Azure AD 中注册你的应用程序,并获取客户端ID和客户端密钥。这些凭据将允许你的应用程序与 Microsoft Graph 进行身份验证和访问权限…...
![](/images/no-images.jpg)
网站开发及运营代理协议范本/快手作品推广网站
我个人理解,RDF是提出的一组技术标准,用于标记网络上的数据。注意:RDF标记的数据,不是文档。通过RDF,我们可以直接的将现实中的事实映射成网络上的数据。在RDF中现实世界中的所有事物都能被视为一个资源(Resource)&…...
![](/images/no-images.jpg)
深圳网站建设网站制作网站推广/湖南关键词优化首选
在启动IOC容器的时候,容器自动装载了一个AutowiredAnnotationBeanPostProcessor后置处理器,当容器扫描到Autowied、Resource或Inject时,就会在IOC容器中自动查找需要的Bean,并装配给该对象的属性。在使用Autowired时,首…...
![](https://www.oschina.net/img/hot3.png)
天津b2b网站建设哪家好/个人如何加入百度推广
2019独角兽企业重金招聘Python工程师标准>>> JSP有三个指令 page :设定页面的属性与相关的功能 include :包含另一个文件的代码 taglib :使用标签库定义 的自定义标签 也有下面的几个动作 jsp:include :当页面被请求时,引入…...
![](https://img2018.cnblogs.com/blog/1343081/201907/1343081-20190703200144056-161250317.png)
设计素材网站会员/成人短期电脑培训班学费
一.内置运算符 1关系运算符 2.算术运算符 3.逻辑运算符 4.复杂类型函数 5.复杂类型函数应用 转载于:https://www.cnblogs.com/yszd/p/11128683.html...
如何网站点击率/如何在百度搜索排名靠前
逆元主要用于除法取余的情况下: 设 inv[b] 是 b 的逆元, 那么 (a/b) %p (a*inv[b]) %p inv[b]是b的逆元的前提是gcd(b,p)1,此时逆元存在 (在mod p情况下的逆元)定义:x是a 的逆元则ax1(modp)其中x <p…...
![](https://img-blog.csdnimg.cn/d052784657fe4cd0b33160f5df4160c9.png)
临沂哪家做网站最好/关键词搜索名词解释
分析: 根据欧拉函数的那个性质 if(p是质数){if(i % p 0) f[i * p] f[i] * p;else f[i * p] f[i] * (p - 1);}每次区间乘的那个数小于等于100,所以我们可以考虑把100以内的数质因数分解,区间乘100相当于区间乘两个2和两个5,但是…...