Spring Boot使用@Async实现异步调用:使用Future以及定义超时

之前连续写了几篇关于使用@Async实现异步调用的内容,也得到不少童鞋的反馈,其中问题比较多的就是关于返回Future的使用方法以及对异步执行的超时控制,所以这篇就来一起讲讲这两个问题的处理。

如果您对于@Async注解的使用还不了解的话,可以看看之前的文章,具体如下:

  • 使用@Async实现异步调用
  • 使用@Async实现异步调用:自定义线程池
  • 使用@Async实现异步调用:资源优雅关闭

定义异步任务

首先,我们先使用@Async注解来定义一个异步任务,这个方法返回Future类型,具体如下:

@Slf4j
@Component
public class Task {

public static Random random = new Random();

@Async("taskExecutor")
public Future<String> run() throws Exception {
long sleep = random.nextInt(10000);
log.info("开始任务,需耗时:" + sleep + "毫秒");
Thread.sleep(sleep);
log.info("完成任务");
return new AsyncResult<>("test");
}

}

Tips:什么是Future类型?

Future是对于具体的Runnable或者Callable任务的执行结果进行取消、查询是否完成、获取结果的接口。必要时可以通过get方法获取执行结果,该方法会阻塞直到任务返回结果。

它的接口定义如下:

public interface Future<V> {
boolean cancel(boolean mayInterruptIfRunning);
boolean isCancelled();
boolean isDone();
V get() throws InterruptedException, ExecutionException;
V get(long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException;
}

它声明这样的五个方法:

  • cancel方法用来取消任务,如果取消任务成功则返回true,如果取消任务失败则返回false。参数mayInterruptIfRunning表示是否允许取消正在执行却没有执行完毕的任务,如果设置true,则表示可以取消正在执行过程中的任务。如果任务已经完成,则无论mayInterruptIfRunning为true还是false,此方法肯定返回false,即如果取消已经完成的任务会返回false;如果任务正在执行,若mayInterruptIfRunning设置为true,则返回true,若mayInterruptIfRunning设置为false,则返回false;如果任务还没有执行,则无论mayInterruptIfRunning为true还是false,肯定返回true。
  • isCancelled方法表示任务是否被取消成功,如果在任务正常完成前被取消成功,则返回 true。
  • isDone方法表示任务是否已经完成,若任务完成,则返回true;
  • get()方法用来获取执行结果,这个方法会产生阻塞,会一直等到任务执行完毕才返回;
  • get(long timeout, TimeUnit unit)用来获取执行结果,如果在指定时间内,还没获取到结果,就直接返回null。

也就是说Future提供了三种功能:

  1. 判断任务是否完成;
  2. 能够中断任务;
  3. 能够获取任务执行结果。

测试执行与定义超时

在完成了返回Future的异步任务定义之后,我们来尝试实现一个单元测试来使用这个Future完成任务的执行,比如:

@Slf4j
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class ApplicationTests {

@Autowired
private Task task;

@Test
public void test() throws Exception {
Future<String> futureResult = task.run();
String result = futureResult.get(5, TimeUnit.SECONDS);
log.info(result);
}

}

上面的代码中,我们在get方法中还定义了该线程执行的超时时间,通过执行这个测试我们可以观察到执行时间超过5秒的时候,这里会抛出超时异常,该执行线程就能够因执行超时而释放回线程池,不至于一直阻塞而占用资源。

完整示例:

读者可以根据喜好选择下面的两个仓库中查看Chapter4-1-5项目:

  • Github:https://github.com/dyc87112/SpringBoot-Learning
  • Gitee:https://gitee.com/didispace/SpringBoot-Learning

如果您对这些感兴趣,欢迎star、follow、收藏、转发给予支持!


money.jpg

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

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

相关文章

《程序员面试金典》解题目录(更新完毕)

题目来源于LeetCode上的《程序员面试金典》&#xff0c;这里做一个目录方便大家查找。另外有本人的LeetCode解题目录、《剑指Offer》解题目录、LintCode代码能力测试CAT 解题目录可点击链接查看。updated on 2020.4.17 不懂的概念可以参考《数据结构与算法之美》学习汇总 已解…

我竟在一篇AI顶会论文里见到了小猪佩奇...

声明&#xff1a;本文原创首发于公众号夕小瑶的卖萌屋。作者&#xff1a;智商掉了一地--->【我是传送门】&#xff0c;内含海量CV/NLP/ML入门资料、必刷综述、前沿论文解读、交流社群、offer神器、学习神器等在介绍接下来的内容前&#xff0c;我们先来看一则笑话&#xff1a…

程序员面试金典 - 面试题 01.01. 判定字符是否唯一(位运算,牛)

1. 题目 实现一个算法&#xff0c;确定一个字符串 s 的所有字符是否全都不同。 示例 1&#xff1a; 输入: s "leetcode" 输出: false 示例 2&#xff1a; 输入: s "abc" 输出: true限制&#xff1a; 0 < len(s) < 100 如果你不使用额外的数据结构…

Spring Boot快速开发利器:Spring Boot CLI

Spring Boot CLI&#xff08;Command Line Interface&#xff09;是一个命令行工具&#xff0c;您可以用它来快速构建Spring原型应用。通过Spring Boot CLI&#xff0c;我们可以通过编写Groovy脚本来快速的构建出Spring Boot应用&#xff0c;并通过命令行的方式将其运行起来。下…

微软发现了一个超简单的NLP上分技巧,还发了ACL2022 ??

文 | QvQ编 | Sheryc_王苏今天给大家介绍一篇来自工业界巨头微软的工作&#xff0c;这篇论文真是把资本家的嘴脸暴露的一览无余&#xff1a;用最低的成本&#xff0c;创造最高的收益&#xff08;狗头.jpg&#xff09;文章从头到尾就阐述了一个结论&#xff1a;通过在输入文本中…

程序员面试金典 - 面试题 01.05. 一次编辑(编辑距离,DP)

1. 题目 字符串有三种编辑操作:插入一个字符、删除一个字符或者替换一个字符。 给定两个字符串&#xff0c;编写一个函数判定它们是否只需要一次(或者零次)编辑。 示例 1: 输入: first "pale" second "ple" 输出: True示例 2: 输入: first "pa…

Spring Boot使用@Async实现异步调用:ThreadPoolTaskScheduler线程池的优雅关闭

上周发了一篇关于Spring Boot中使用Async来实现异步任务和线程池控制的文章&#xff1a;《Spring Boot使用Async实现异步调用&#xff1a;自定义线程池》。由于最近身边也发现了不少异步任务没有正确处理而导致的不少问题&#xff0c;所以在本文就接前面内容&#xff0c;继续说…

MIT毕业生亲述:在Deepmind打工是一种什么样的体验?

文 | Akhil Raju源 | 机器之心在这里&#xff0c;既有头脑风暴&#xff0c;也有生活气息。本月初&#xff0c;时任苹果机器学习总监的 Ian Goodfellow 宣布在加入公司三年后辞职&#xff0c;没过几天&#xff0c;就有消息曝出大神去向定了&#xff0c;他将重返谷歌加入 DeepMin…

LeetCode 72. 编辑距离(DP)

1. 题目 给定两个单词 word1 和 word2&#xff0c;计算出将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作&#xff1a; 插入一个字符删除一个字符替换一个字符 示例 1: 输入: word1 "horse", word2 "ros" 输出: 3 解…

毕业后到底去学术界还是工业界?杜克大学陈怡然教授亲述5条“小秘籍”

文 | 卖萌酱大家好&#xff0c;我是卖萌酱。今天和大家聊一个非常受关心的话题&#xff1a;毕业到底是去学术界还是工业&#xff1f;刚好最近看到杜克大学陈怡然教授在微博上对此有亲身感悟&#xff1a;陈怡然教授认为回学校而不去公司有以下几个理由&#xff1a;1. 我不喜欢随…

程序员面试金典 - 面试题 17.11. 单词距离(multimap平衡二叉搜索树)

1. 题目 有个内含单词的超大文本文件&#xff0c;给定任意两个单词&#xff0c;找出在这个文件中这两个单词的最短距离(相隔单词数)。 如果寻找过程在这个文件中会重复多次&#xff0c;而每次寻找的单词不同&#xff0c;你能对此优化吗? 示例&#xff1a; 输入&#xff1a;w…

腾讯薪酬改革来了!晋升≠加薪?员工到底为何工作?

文 | 天于刀刀这届打工人真的是太太太难了&#xff01;朝九晚九地写PPT&#xff0c;熬KPI&#xff0c;疫情它来了&#xff1b;终于习惯了隔离核酸&#xff0c;走出EMO&#xff0c;隔壁工位的同学被毕业了&#xff1b;最终凭着玄学幸运留组&#xff0c;还没来得及准备庆祝一下六…

Spring Boot和Feign中使用Java 8时间日期API(LocalDate等)的序列化问题

LocalDate、LocalTime、LocalDateTime是Java 8开始提供的时间日期API&#xff0c;主要用来优化Java 8以前对于时间日期的处理操作。然而&#xff0c;我们在使用Spring Boot或使用Spring Cloud Feign的时候&#xff0c;往往会发现使用请求参数或返回结果中有LocalDate、LocalTim…

LeetCode 1054. 距离相等的条形码(优先队列)

1. 题目 在一个仓库里&#xff0c;有一排条形码&#xff0c;其中第 i 个条形码为 barcodes[i]。 请你重新排列这些条形码&#xff0c;使其中两个相邻的条形码 不能 相等。 你可以返回任何满足该要求的答案&#xff0c;此题保证存在答案。 示例 1&#xff1a; 输入&#xff1a…

Meta AI团队大换血!组织拆散,高管离职,LeCun进军元宇宙??

编 | 桃子 时光源 | 新智元【导读】全力助攻元宇宙&#xff0c;Meta人工智能部门要重组了&#xff01;今天&#xff0c;Yann LeCun发文表示&#xff0c;Meta的人工智能实验室FAIR将整合到Reality Labs中。另外&#xff0c;任职4年的人工智能高管Jerome Pesenti也宣布了将要离职…

【译】Spring Boot 2.0 官方迁移指南

前提 希望本文档将帮助您把应用程序迁移到 Spring Boot 2.0。 在你开始之前 首先&#xff0c;Spring Boot 2.0 需要 Java 8 或更高版本。不再支持 Java 6 和 7 了。 在 Spring Boot 2.0 中&#xff0c;许多配置属性被重新命名/删除&#xff0c;开发人员需要更新application…

剑指Offer - 面试题22. 链表中倒数第k个节点(快慢指针)

1. 题目 输入一个链表&#xff0c;输出该链表中倒数第k个节点。为了符合大多数人的习惯&#xff0c;本题从1开始计数&#xff0c;即链表的尾节点是倒数第1个节点。例如&#xff0c;一个链表有6个节点&#xff0c;从头节点开始&#xff0c;它们的值依次是1、2、3、4、5、6。这个…

AI正在改变制造业!快递单信息抽取、智能物流仓案例盘点

大家好&#xff0c;我是卖萌酱。制造业作为国民经济主体&#xff0c;是国家创造力、竞争力和综合国力的重要体现。作为制造强国建设的主攻方向&#xff0c;智能制造发展水平关乎我国未来制造业的全球地位。制造业与物流结合紧密&#xff0c;随着制造业的高速发展&#xff0c;对…

Spring Boot 2.0 新特性(二):新增事件ApplicationStartedEvent

今天继续来聊Spring Boot 2.0的新特性。本文将具体说说2.0版本中的事件模型&#xff0c;尤其是新增的事件&#xff1a;ApplicationStartedEvent。 在Spring Boot 2.0中对事件模型做了一些增强&#xff0c;主要就是增加了ApplicationStartedEvent事件&#xff0c;所以在2.0版本中…

剑指Offer - 面试题57. 和为s的两个数字(双指针)

1. 题目 输入一个递增排序的数组和一个数字s&#xff0c;在数组中查找两个数&#xff0c;使得它们的和正好是s。如果有多对数字的和等于s&#xff0c;则输出任意一对即可。 示例 1&#xff1a; 输入&#xff1a;nums [2,7,11,15], target 9 输出&#xff1a;[2,7] 或者 [7,…