1、开启子线程并获取子线程结果
@Test public void test1() { SmallTool.printTimeAndThread("媳妇进入餐厅"); SmallTool.printTimeAndThread("媳妇点饭, 蛋炒饭 + 米饭"); CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> { SmallTool.printTimeAndThread("厨师炒菜"); SmallTool.sleepMillis(200); SmallTool.printTimeAndThread("厨师盛饭"); SmallTool.sleepMillis(200); return "饭做好了"; }); SmallTool.printTimeAndThread("媳妇在玩手机"); SmallTool.printTimeAndThread(String.format("%s, 媳妇开吃",future.join())); }
2、thenCompose:连接两个异步任务(第一个异步任务完成后执行第二个异步任务)
@Test public void test2() { SmallTool.printTimeAndThread("媳妇进入餐厅"); SmallTool.printTimeAndThread("媳妇点饭, 蛋炒饭 + 米饭"); CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> { SmallTool.printTimeAndThread("厨师炒菜"); SmallTool.sleepMillis(200); return "饭做好了"; }).thenCompose(res -> CompletableFuture.supplyAsync(() -> { //厨师炒完菜服务员才端饭 SmallTool.printTimeAndThread(res); SmallTool.printTimeAndThread("服务员端饭"); SmallTool.sleepMillis(200); return "饭盛好了"; })); SmallTool.printTimeAndThread("媳妇在玩手机"); SmallTool.printTimeAndThread(String.format("%s, 媳妇开吃",future.join())); }
3、thenCombine:两个异步任务并行执行
@Test public void test3() { SmallTool.printTimeAndThread("媳妇进入餐厅"); SmallTool.printTimeAndThread("媳妇点饭, 蛋炒饭 + 米饭"); CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> { SmallTool.printTimeAndThread("厨师炒菜"); SmallTool.sleepMillis(200); return "菜做好了"; }).thenCombine(CompletableFuture.supplyAsync(() -> { //炒菜和做饭同时进行 SmallTool.sleepMillis(200); return "米饭做好了"; }), (r1, r2) -> { SmallTool.printTimeAndThread("服务员端饭"); SmallTool.sleepMillis(200); return String.format("%s和%s做好了", r1, r2); }); SmallTool.printTimeAndThread("媳妇在玩手机"); SmallTool.printTimeAndThread(String.format("%s, 媳妇开吃",future.join())); }
4、appltToEither:两个异步任务只有有一个执行完毕。exceptionally:异步任务中发送异常时执行
@Test public void test5() { SmallTool.printTimeAndThread("小白吃完饭打车"); CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> { SmallTool.printTimeAndThread("700路公交车来了"); SmallTool.sleepMillis(200); return "700路公交"; }).applyToEither(CompletableFuture.supplyAsync(() -> { SmallTool.printTimeAndThread("800路公交车来了"); SmallTool.sleepMillis(200); return "800路公交"; }), firstComeBus -> { if(firstComeBus.startsWith("700")) { throw new RuntimeException("撞树上了"); } return firstComeBus; }).exceptionally(e -> { SmallTool.printTimeAndThread("小白叫出租车"); SmallTool.sleepMillis(200); return "出租车 叫到了"; }); SmallTool.printTimeAndThread(String.format("%s",future.join())); }
未完待续......
标签:200,return,printTimeAndThread,sleepMillis,SmallTool,CompletableFuture,使用 From: https://www.cnblogs.com/wscw/p/17238320.html