CompletableFuture 异步处理

preview
需积分: 0 4 下载量 132 浏览量 更新于2022-07-16 收藏 1.77MB PPTX 举报
【异步和同步编程】 在计算机编程中,同步和异步是两种不同的处理方式,主要涉及到如何管理和控制程序的执行顺序。同步编程是指程序按照线性的顺序执行,一个任务必须等待前一个任务完成后才能继续执行。这在处理简单任务或者不需要并发执行的情况下是常见的做法。然而,当涉及到网络通信、I/O操作等耗时任务时,同步编程会导致程序阻塞,浪费CPU资源。 异步编程则是为了解决这种阻塞问题,它允许程序在等待某些耗时操作完成的同时,可以继续执行其他任务。这样可以提高程序的响应速度和整体效率,特别是在处理大量并发请求时。异步编程通常与回调函数、事件驱动或承诺(Promise)机制相关联,Java中的CompletableFuture是另一种实现异步编程的方式。 【CompletableFuture】 CompletableFuture是Java 8引入的一个高级异步编程工具,它是Future接口的扩展,提供了更强大的功能。CompletableFuture不仅支持异步执行,还支持任务的组合、转换和链式调用,使得编写复杂的异步程序变得更加简洁。通过实现CompletionStage接口,CompletableFuture可以将多个异步任务连接在一起,形成一个任务流水线。 CompletableFutur的四种方法: 1. `supplyAsync(Supplier<U> supplier)`: 这个方法接受一个Supplier,用于生成一个带有返回值的异步任务。默认使用ForkJoinPool.commonPool()作为线程池执行任务。 2. `supplyAsync(Supplier<U> supplier, Executor executor)`: 与前一个方法类似,但它允许指定自定义的Executor,这样可以更好地控制任务执行的环境,避免对系统默认线程池造成压力。 3. `runAsync(Runnable runnable)`: 这个方法用于创建无返回值的异步任务,它接收一个Runnable对象。同样,也有默认线程池和自定义线程池两个版本。 4. `runAsync(Runnable runnable, Executor executor)`: 类似于`runAsync()`,但允许指定线程池。 【异步执行示例】 以下是一个简单的CompletableFuture使用示例,展示如何异步执行任务并处理结果: ```java Supplier<String> task = () -> { Thread.sleep(2000); // 模拟耗时操作 return "Task Result"; }; CompletableFuture<String> future = CompletableFuture.supplyAsync(task); future.thenAccept(result -> System.out.println("Received result: " + result)); ``` 在这个例子中,主线程不会阻塞,而是立即返回并继续执行其他代码,直到CompletableFuture的结果准备好,然后通过`thenAccept`方法提供的回调函数处理结果。 【同步与异步、阻塞与非阻塞的区别】 同步和异步关注的是消息通信机制,同步需要等待结果返回,而异步则不需要。阻塞和非阻塞则涉及调用者如何等待结果。阻塞调用会一直等待,直到收到响应,而非阻塞调用会立即返回,让调用者在等待结果的同时可以执行其他任务。非阻塞异步通常通过回调或事件通知机制来传递结果,避免了不必要的等待。 总结,CompletableFuture是Java中处理异步编程的强大工具,它通过提供丰富的API和灵活的任务编排方式,简化了异步编程的复杂性,提升了代码的可读性和可维护性。开发者可以根据具体需求选择合适的方法,创建和组合异步任务,以实现高效的并发执行。