whenComplete-任务完成或者异常时运行action,有返回值
- whenComplete与handle的区别在于,它不参与返回结果的处理,把它当成监听器即可
- 即使异常被处理,在CompletableFuture外层,异常也会再次复现
- 使用whenCompleteAsync时,返回结果则需要考虑多线程操作问题,毕竟会出现两个线程同时操作一个结果
public CompletableFuture<T> whenComplete(BiConsumer<? super T, ? super Throwable> action) public CompletableFuture<T> whenCompleteAsync(BiConsumer<? super T, ? super Throwable> action) public CompletableFuture<T> whenCompleteAsync(BiConsumer<? super T, ? super Throwable> action,Executor executor)1234
- 使用示例
CompletableFuture<AtomicBoolean> first = CompletableFuture.supplyAsync(() -> {if (true) {throw new RuntimeException("main error!"); }return "hello world";}).thenApply(data -> new AtomicBoolean(false)).whenCompleteAsync((data,e) -> {//异常捕捉处理, 但是异常还是会在外层复现System.out.println(e.getMessage());});first.join();--------输出结果--------java.lang.RuntimeException: main error!Exception in thread "main" java.util.concurrent.CompletionException: java.lang.RuntimeException: main error! ... 5 more123456789101112131415
6 多个任务的简单组合public static CompletableFuture<Void> allOf(CompletableFuture<?>... cfs)public static CompletableFuture<Object> anyOf(CompletableFuture<?>... cfs)12
文章插图
文章插图
- 使用示例
CompletableFuture<Void> future = CompletableFuture.allOf(CompletableFuture.completedFuture("A"),CompletableFuture.completedFuture("B"));//全部任务都需要执行完future.join();CompletableFuture<Object> future2 = CompletableFuture.anyOf(CompletableFuture.completedFuture("C"),CompletableFuture.completedFuture("D"));//其中一个任务行完即可future2.join();12345678910
8 取消执行线程任务// mayInterruptIfRunning 无影响;如果任务未完成,则返回异常public boolean cancel(boolean mayInterruptIfRunning) //任务是否取消public boolean isCancelled()1234
- 使用示例
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {try { Thread.sleep(1000);} catch (Exception e) { }return "hello world";}).thenApply(data -> 1);System.out.println("任务取消前:" + future.isCancelled());// 如果任务未完成,则返回异常,需要对使用exceptionally,handle 对结果处理future.cancel(true);System.out.println("任务取消后:" + future.isCancelled());future = future.exceptionally(e -> {e.printStackTrace();return 0;});System.out.println(future.join());--------输出结果--------任务取消前:false任务取消后:truejava.util.concurrent.CancellationException at java.util.concurrent.CompletableFuture.cancel(CompletableFuture.java:2276) at Test.main(Test.java:25)01234567891011121314151617181920212223
9 任务的获取和完成与否判断// 任务是否执行完成public boolean isDone()//阻塞等待 获取返回值public T join()// 阻塞等待 获取返回值,区别是get需要返回受检异常public T get()//等待阻塞一段时间,并获取返回值public T get(long timeout, TimeUnit unit)//未完成则返回指定valuepublic T getNow(T valueIfAbsent)//未完成,使用value作为任务执行的结果,任务结束 。需要future.get获取public boolean complete(T value)//未完成,则是异常调用,返回异常结果,任务结束public boolean completeExceptionally(Throwable ex)//判断任务是否因发生异常结束的public boolean isCompletedExceptionally()//强制地将返回值设置为value,无论该之前任务是否完成;类似completepublic void obtrudeValue(T value)//强制地让异常抛出,异常返回,无论该之前任务是否完成;类似completeExceptionallypublic void obtrudeException(Throwable ex) 1234567891011121314151617181920
- 使用示例
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {try { Thread.sleep(1000);} catch (Exception e) { }return "hello world";}).thenApply(data -> 1);System.out.println("任务完成前:" + future.isDone());future.complete(10);System.out.println("任务完成后:" + future.join());--------输出结果--------任务完成前:false任务完成后:1012345678910111213
推荐阅读
- 史书上不会公开的历史真相 中国古代历史未解之谜
- 葡萄会不会上火 吃萄葡会不会上火
- 明年会不会干旱 冬天为什么会干旱
- 今年冬天会不会很冷2021 2021是不是最冷的冬天
- 网编基础,我只看这篇文章,网络编程基础篇
- Win10将原生兼容安卓App,但模拟器不会被打败
- 化妆|“会化妆”与“不会化妆”的女人,看眉毛和口红就知道:差别太大
- 自动加热的泡脚桶会漏电吗 泡脚桶会不会漏电致死
- 口腔纤维化戒掉槟榔会不会恢复? 吃槟榔为什么会导致口腔纤维化
- selsun洗发水会不会脱发 selsun洗发水可以长期使用吗