序言
通过对此书的学习,能够让我们获取以下问题的答案:
- 为什么使用异步编程?
- 在 Java 中如何编写异步编程的代码?
- 在 Java 中如何编写对异步编程的结果进行特殊处理的代码?
第一章——认识异步编程
本章主要探讨一个问题:为什么使用异步编程?
主要原因是在使用同步编程时,存在一些问题:
- 同步必须等待任务执行完成,但有时候任务是否执行完成我们并不需要知道(更关心任务执行了就可以了),比如日志的打印
- 同步操作等待任务返回结果过程中不能做任何其他事情,比如在移动应用程序中,在用户操作移动设备屏幕发起请求后, 如果是同步等待后台服务器返回结果,则当后台服务操作非常耗时时,就会造成用户看到移动设备屏幕冻结。在结果返回前,用户不能操作移动设备的其他功能,这对用户体验非常不好
- 同步必须顺序执行多个任务,耗时更长,也无回调函数(无则需要阻塞获取任务结果),比如我们在一个线程 A 中通过 RPC 请求获取服务 B 和服务 C 的数据,然后基于两者的结果做一些事情。在同步调用情况下,线程 A 需要调用服务 B,然后同步等待服务 B 结果返回后,才可以对服务 C 发起调用,等服务 C 结果返回后才可以结合服务 B 和 C 的结果执行其他操作。
- 同步比较浪费资源且多线程情况下对共享资源访问存在并发问题,因为每个线程同时只能发起一个请求并同步等待返回,所以为了提高系统性能,此时我们就需要引入更多的线程来实现并行化处理。但是多线程下对共享资源进行访问时,不可避免会引入资源争用和并发问题;另外,操作系统层面对线程的个数是有限制的,不可能通过无限增加线程数来提供系统性能;而且,使用同步阻塞的编程方式还会浪费资源,比如发起网络 IO 请求时,调用线程就会处于同步阻塞等待响应结果的状态,而这时候调用线程明明可以去做其他事情,等网络 IO 响应结果返回后再对结果进行处理
而使用异步编程能很好的优化或解决上面的问题,因为:
- 异步可以不等待任务执行完成就立即返回,任务是否执行完成我们并不需要知道(任务执行了就可以了),因此日志的打印一般都使用异步
- 异步可以不等待任务执行完成就去做其他事情,因此在移动应用程序中,若在用户操作移动设备屏幕发起异步请求后,调用线程会马上返回, 具体返回结果会通过 UI 线程异步进行渲染,且在这期间用户可以使用移动设备的其他功能,用户体验更好
- 异步可以并发执行多个任务耗时更短,若多个任务都使用异步请求,则最大耗时取决于调用时间最长的任务
第二章——显式使用线程和线程池实现异步编程
本章主要探讨一个问题:在 Java 中如何编写异步编程的代码?
在 Java 中实现异步编程最简单的方式是:每当有异步任务要执行 时,使用Thread来创建一个线程来进行异步执行。
由于频繁的创建线程比较消耗资源,而线程池可以提前预热线程并保活,因此本章后续又介绍了线程池的使用。
第三章——基于 JDK 中的 Future 实现异步编程
本章主要探讨一个问题:在 Java 中如何编写对异步编程的结果进行特殊处理的代码?
在 JUC 包中Future代表着异步计算结果,Future中提供了一系列方法用来检查计算结果是否已经完成,也提供了同步等待任务执行完成的方法,还提供了获取计算结果的方法
FutureTask虽然提供了以上这些特殊的方法,但是这些特色并不足以让我们写出简洁的并发代码,比如它:
- 无法清晰地表达多个 FutureTask 之间的关系
- 为了从
Future获取结果,必须调用get()方法,而此方法会在任务执行完毕前一直阻塞调用线程
这明显不是我们想要的结果,我们真正想要的是异步编程是:
- 支持反应式编程,即当任务计算完成后能进行通知,并且可以以计算结果作为一个行为动作的参数,去方便下一步的计算,而不是仅仅提供调用线程以阻塞的方式获取计算结果
- 可以通过编程的方式手动设置(代码的方式)
Future的结果;FutureTask不能实现让用户通过函数来设置其计算结果,而是在其任务内部来进行设置 - 可以等多个
Future对应的计算结果都出来后做一些事情
为了克服 FutureTask 的局限性,以及满足我们对异步编程的需要, JDK8 中提供了CompletableFuture。
通过组合使用CompletableFuture的各个方法,我们能够:
- 多个异步任务关联串行执行
- 多个异步任务并发执行
第四章——Spring 框架中的异步执行
本章主要探讨一个问题:在 Spring 中如何编写异步编程的代码?
在 Spring Framework 中分别使用TaskExecutor和TaskScheduler接口提供异步执行和任务调度的抽象,当然,我们可以通过使用基于TaskExecutor支撑的注解@Async对代码进行异步处理。
参考
- 翟陆续. Java 异步编程实战 [M].机械工业出版社,2020