springboot通过@async注解实现异步任务

1. 异步方法返回类型为void

1.在启动类上加@EnableAsyn注解

@SpringBootApplication
@EnableAsync
public class NmshistoryApplication {

	public static void main(String[] args) {
		SpringApplication.run(NmshistoryApplication.class, args);
	}

}

2.把@Async注解加到所需实现异步调用的方法上。

    @Async
    @Override
    public void DailyAsyncSave(String startDate, int pageNum, int pageNumTail) {

1. 异步方法返回类型不为void

 1.Future< T >
    @Async
    @Override
    public Future<List<String>> getList() {
        List<String> list = new ArrayList<>();
        return new AsyncResult<>(list);
    }

isDone() 用来判断该异步任务是否执行完成,如果执行完成,则返回true,反之。
get() 获取异步任务的执行结果,这个方法是阻塞的,直到异步任务执行完成。

        Future<List<String>> r1 = futureService.aynsc1();
        Future<List<String>> r2 = futureService.aynsc2();
        Future<List<String>> r3 = futureService.aynsc3();
        while(true) {
            if(r1.isDone() && r2.isDone() && r3.isDone()) {/
                //如果异步方法全部执行完,跳出循环
                break;
            }
            Thread.sleep(2000);//每隔2000毫秒判断一次
        }

通过while循环可保证所有任务结束后再拿的返回数据。

 2.CompletableFuture< T >
    @Async
    @Override
    public CompletableFuture<List<CameraVo>>  getVosByPage(int head ) {
        List<CameraVo> voList = new ArrayList<>();
        return CompletableFuture.completedFuture(voList);

completedFuture()里面存放异步方法处理后的数据

        CompletableFuture<List<CameraVo>> vosByPage1 = asyncDealDateService.getVosByPage(0, LLeftMiddleNum, records, queryCamDTO);
        CompletableFuture<List<CameraVo>> vosByPage2 = asyncDealDateService.getVosByPage(LLeftMiddleNum, LeftMiddleNum, records, queryCamDTO);
        CompletableFuture<List<CameraVo>> vosByPage3 = asyncDealDateService.getVosByPage(LeftMiddleNum, RLeftMiddleNum, records, queryCamDTO);
        CompletableFuture.allOf(vosByPage1, vosByPage2, vosByPage3);

        try {
            List<CameraVo> cameraVos1 = vosByPage1.get();
            voList.addAll(cameraVos1);
            List<CameraVo> cameraVos2 = vosByPage2.get();
            voList.addAll(cameraVos2);
            List<CameraVo> cameraVos3 = vosByPage3.get();
            voList.addAll(cameraVos3);
                } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

CompletableFuture.allOf()所有任务执行结束后才会执行下面的代码块,所有任务没有结束会阻塞等待,比Future< T >用while()手动实现方便快捷

注:
1.加在类上则改类下的所有方法都异步调用
2. 调用方法和异步方法不能在同一个类上

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值