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()可以得到异步线程的异常

由于没文档,也是第一次接触,反正想要的目的达到了就行!哈哈....

经验分享 程序员 微信小程序 职场和发展