并发编程之:异步调用获取返回值 (3)

多个CompletableFuture可以串行执行,如第一个任务先进行查询,第二个任务再进行更新

public class CompletableFutureDemo { public static void main(String[] args) throws InterruptedException { // 第一个任务 CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> 1234); // 第二个任务 CompletableFuture<Integer> secondFuture = future.thenApplyAsync((num) -> { System.out.println("num:" + num); return num + 100; }); secondFuture.thenAccept(System.out::println); System.out.println("主线程继续执行"); Thread.sleep(5000); System.out.println("主线程执行结束"); } } 并行任务

CompletableFuture除了可以串行,还支持并行处理。

public class CompletableFutureDemo { public static void main(String[] args) throws InterruptedException { // 第一个任务 CompletableFuture<Integer> oneFuture = CompletableFuture.supplyAsync(() -> 1234); // 第二个任务 CompletableFuture<Integer> twoFuture = CompletableFuture.supplyAsync(() -> 5678); // 通过anyOf将两个任务合并为一个并行任务 CompletableFuture<Object> anyFuture = CompletableFuture.anyOf(oneFuture, twoFuture); anyFuture.thenAccept(System.out::println); System.out.println("主线程继续执行"); Thread.sleep(5000); System.out.println("主线程执行结束"); } }

通过anyOf()可以实现多个任务只有一个成功,CompletableFuture还有一个allOf()方法实现了多个任务必须都成功之后的合并任务。

小结

Runnable接口实现的异步线程默认不能返回任务运行的结果,当然可以通过改造实现返回,但是复杂度高,不适合进行改造;

Callable接口配合FutureTask可以满足异步任务结果的返回,但是存在一个问题,主线程在获取不到结果时会阻塞等待;

CompletableFuture进行了增强,只需要指定任务执行结束或异常时的回调对象,在结束后会自动执行,并且支持任务的串行,并行和多个任务都执行完毕后再执行等高级方法。

以上就是本期的全部内容,我们下期见,如果觉得有用点个关注呗。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzxwzf.html