CompletableFuture 详解
CompletableFuture 提供了丰富的方法来异步处理任务。
CompletableFuture.runAsync 用于执行没有返回值的任务,常用于不需要返回结果的业务 void
public static CompletableFuture<Void> runAsync(Runnable runnable) { return asyncRunStage(asyncPool, runnable); }
CompletableFuture.supplyAsync 用于执行有返回值的任务 , join() 获取任务执行后的返回结果。
CompletableFuture<String> future = CompletableFuture.supplyAsync(()->{ return "返回值" })
future.join()
获取返回任务值:
// 如果完成则返回结果,否则就抛出具体的异常 public T get() throws InterruptedException, ExecutionException // 最大时间等待返回结果,否则就抛出具体异常 public T get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException // 完成时返回结果值,否则抛出unchecked异常。为了更好地符合通用函数形式的使用,如果完成此 CompletableFuture所涉及的计算引发异常,则此方法将引发unchecked异常并将底层异常作为其原因 public T join() // 如果完成则返回结果值(或抛出任何遇到的异常),否则返回给定的 valueIfAbsent。 public T getNow(T valueIfAbsent) // 如果任务没有完成,返回的值设置为给定值 public boolean complete(T value) // 如果任务没有完成,就抛出给定异常 public boolean completeExceptionally(Throwable ex)
异步回调处理:thenApply和thenApplyAsync
thenApply 表示某个任务执行完成后执行的动作,即回调方法,会将该任务的执行结果即方法返回值作为入参传递到回调方法中,带有返回值
CompletableFuture<String> future = CompletableFuture.supplyAsync(()->{ return "返回值" }).thenApply((result)->{ //对返回结果处理 })
thenAccept() 方法没有返回值 ,仅用于消费任务结果
CompletableFuture<String> future = CompletableFuture.supplyAsync(()->{ return "返回值" }).thenAccept(result->{ //对返回结果处理 })
allOf() 等待所有任务都完成之后再执行
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(()->1); CompletableFuture<String> future2 = CompletableFuture.supplyAsync(()->2); CompletableFuture<String> all = CompletableFuture.allOf(future1,future2); all.join()
exceptionally() 异常处理:
CompletableFuture<String> future = CompletableFuture.supplyAsync(()->{ throw new RuntimeException("任务异常"); }) future.exceptionally(ex->{ System.out.println(ex.getMessage()); })