非同步和非阻塞
什么是非同步?
- 异步执行
- 不是同步的方式运行,或者不是按照你描述的顺序发生。
什么是非阻塞
- 不是阻塞的
- 不会造成线程的阻塞
为什么需要异步呢?
- 业务方法太耗时间
- 网络开销
- 加解密操作
- 文件上传下载
- ......
同步方式有什么坏处?
- Web 服务,因为执行某些过长的线程长时间占用线程,则你的服务吞吐量严重降低。
- 桌面或者手机的应用,执行可能会卡顿,等待服务的请求耗时。
传统的阻塞业务处理示例
// 10 seconds
Image img1 = download();
render(img1);
// 12 seconds
Image img2 = download();
render(img2);
这些业务方代码很耗费时间,并且传统的写法,每个方法操作控制起来非常不方便。
Java 8 之前的做法
- java.lang.Thread
- JDK1.0
对于上述的示例代码基于JDK8 Consumer 的实现
void downloadAsync(String url,Consumer<Image> c) {
new Thread(() -> {
Image result = download(url);
c.accept(result);
} ).start();
}
这样实现好么?使用Thread 的这种方式存在什么缺点?
- 使用Thread 的方式经常需要配合 synchronized,wait,notify 和 join
- 不同Thread 之间如何存取同一份数据?
- 如何管控?
- 如何进行业务方法之间的组合和依赖?
如何对方法之间进行依赖处理示例:
fetchDataAsync (data -> {
downloadAsync(data , image -> render(image));
});
上述代码可以实现我们想要的结果,但是不推荐,Thread 并没有进行相关的方法组合、依赖API,这种实现方式,到后边基本就成了回调地狱。