Java 异步同时执行多个任务,并且返回其结果
1.采用Hutool工具;
引入pom:
<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.7.4</version> </dependency>
2.里面有一个工具类,其中看到两种
3.我业务是需要查询两次mySql,但是查询时间都有长,所以试一试这个方法:
Integer i=0; List<LabelMessageVo> labelMessageVos=null; try { CompletionService<Object> objectCompletionService = ThreadUtil.newCompletionService();//构造次函数 //调用其.submit()方法执行需要执行的业务函数,用于业务函数一 Future<Object> submit = objectCompletionService.submit(() -> //下列为业务函数一 //return : Integer printManageServiceImp.labelMessageVoListCount(parameter1, parameter2)); //再调用一次其.submit()方法执行需要执行的业务函数,用于业务函数二 Future<Object> submit1 = objectCompletionService.submit(() -> //下列为业务函数二 //return : List<LabelMessageVo> printManageServiceImp.labelMessageVoList(parameter1,parameter2)); /** *调用.take()获取统一的返回值,然后.get()获取函数所返回的值 * 此时得注意,由于是异步执行,所以返回的结果排序是看哪一个函数执行得快,就排在第一位 *有两个业务上的函数,就获取两次 */ Object take1 = objectCompletionService.take().get(); Object take2 = objectCompletionService.take().get();//这个就是你两条函数中用时最久的一个 //由于获取的是Object类型参数,可以通过判断其属性,来获取对应的返回值 if (take1 instanceof Integer) { i = (Integer) take1; labelMessageVos= (List<LabelMessageVo>)take2; }else{ labelMessageVos= (List<LabelMessageVo>)take1; i = (Integer) take2; } } catch (Exception e) { e.printStackTrace(); }
数据库会出现分别来自两个业务函数的两条并行的sql语句,这样返回数据时就是取所用时间最长的一条线程
然后就是业务代码.
小记:
1. 主线程下是获取不到其他非堵塞异步线程中的异常的(主线程都都运行完了,异步线程只有抛在自己线程中)
2. CompletionService不同,毕竟是返回结果的,在调用objectCompletionService.take().get()可以得到异步线程的异常
由于没文档,也是第一次接触,反正想要的目的达到了就行!哈哈....
上一篇:
通过多线程提高代码的执行效率例子