前言
本文章只是个人简单测试使用的,如果用到项目中 请按项目实际情况使用
简单使用
注意点:使用CompletableFuture默认的线程池则主线程结束整个方法执行就会结束,不会等待异步方法执行完成
String types[] = {"4362","8924","4363","8801"}; TimeInterval timer = DateUtil.timer(); List<SpdbInterLog> list00 = new ArrayList<>(); List<SpdbInterLog> list11 = new ArrayList<>(); CompletableFuture<List<SpdbInterLog>> listCompletableFuture = CompletableFuture.supplyAsync(() -> { Page page = new Page(); page.setCurrent(1); page.setSize(10000); System.out.println(JSON.toJSONString(types)); return spdbInterLogService.page(page,Wrappers.<SpdbInterLog>lambdaQuery().in(SpdbInterLog::getType, types)).getRecords(); }); CompletableFuture<List<SpdbInterLog>> listCompletableFuture1 = CompletableFuture.supplyAsync(() -> { Page page = new Page(); page.setCurrent(1); page.setSize(10000); return spdbInterLogService.page(page).getRecords(); }); list00 = listCompletableFuture.get(); list11 = listCompletableFuture1.get(); //注:只有当点get方法的时候每次执行都有数据,否则没有点get()等待方法执行完成的会获得空数据 System.out.println("list00大小="+list00.size()); System.out.println("list11大小="+list11.size()); long interval = timer.interval(); if (list00.size()==list11.size()) { return R.ok(interval); } return R.failed(interval);
获取空数据例子
String types[] = {"4362","8924","4363","8801"}; TimeInterval timer = DateUtil.timer(); List<SpdbInterLog> list00 = new ArrayList<>(); List<SpdbInterLog> list11 = new ArrayList<>(); CompletableFuture<List<SpdbInterLog>> listCompletableFuture = CompletableFuture.supplyAsync(() -> { Page page = new Page(); page.setCurrent(1); page.setSize(10000); System.out.println(JSON.toJSONString(types)); return spdbInterLogService.page(page,Wrappers.<SpdbInterLog>lambdaQuery().in(SpdbInterLog::getType, types)).getRecords(); }); CompletableFuture<List<SpdbInterLog>> listCompletableFuture1 = CompletableFuture.supplyAsync(() -> { Page page = new Page(); page.setCurrent(1); page.setSize(10000); return spdbInterLogService.page(page).getRecords(); }); list00 = listCompletableFuture.get(); //listCompletableFuture1没有点get方法所以执行的时候返回结果可能为空 System.out.println("list00大小="+list00.size()); System.out.println("list11大小="+list11.size()); long interval = timer.interval(); if (list00.size()==list11.size()) { return R.ok(interval); } return R.failed(interval);
优化
可以吧get方法换成whenComplete方法CompletableFuture:CompletableFuture的whenComplete方法表示,某个任务执行完成后,执行的回调方法,无返回值;并且whenComplete方法返回的CompletableFuture的result是上个任务的结果。
注意:whenComplete程序出错后不会正常执行,handle和whenComplete用法一致,但handle在程序出错后会继续执行,此方法比whenComplete多返回值,两个方法可以一起使用哦
System.out.println("游戏开始"); ExecutorService executor = Executors.newFixedThreadPool(5); CompletableFuture.supplyAsync(()->{ System.out.println("开始超级马里奥游戏-----"); try { Thread.sleep(2000*2); } catch (InterruptedException e) { e.printStackTrace(); } return "怪已被全部击败"; },executor).whenComplete((result,e)->{ System.out.println(result+"游戏结束"); }); CompletableFuture.supplyAsync(()->{ System.out.println("开始狂野飙车游戏-----"); try { Thread.sleep(2000*4); } catch (InterruptedException e) { e.printStackTrace(); } return "追赶第一"; },executor).whenComplete((result,e)->{ System.out.println(result+"游戏结束"); }); CompletableFuture.supplyAsync(()->{ System.out.println("开始飞机大战游戏-----"); try { Thread.sleep(2000*1); } catch (InterruptedException e) { e.printStackTrace(); } return "飞机全部被打下"; },executor).whenComplete((result,e)->{ System.out.println(result+"游戏结束"); }); System.out.println("111111111111111111"); executor.shutdown(); System.out.println("222222222222222222"); int i=0; while (true){ String format = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); System.out.println(format); try { Thread.sleep(1000); i++; if (i>=10) { break; } } catch (InterruptedException e) { e.printStackTrace(); } } 控制台打印输出: 游戏开始 开始超级马里奥游戏----- 开始狂野飙车游戏----- 开始飞机大战游戏----- 111111111111111111 222222222222222222 2021-12-03 08:55:06 2021-12-03 08:55:07 飞机全部被打下游戏结束 2021-12-03 08:55:08 2021-12-03 08:55:09 怪已被全部击败游戏结束 2021-12-03 08:55:10 2021-12-03 08:55:11 2021-12-03 08:55:12 2021-12-03 08:55:13 追赶第一游戏结束 2021-12-03 08:55:14 2021-12-03 08:55:15