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. 调用方法和异步方法不能在同一个类上