【Java】同步异步阻塞非阻塞概念
一. 阻塞/非阻塞
阻塞非阻塞说的是线程的状态
- 阻塞: 线程调用IO接口后,一直等待,不能做其它事
- 非阻塞:线程调用IO接口时,可以做其它事,不用一直等待
二. 同步/异步
同步和异步说的是消息的通知机制
- 同步:线程调用IO接口后,不停询问IO接口是否完成
- 异步:线程调用IO接口后,不用一直询问,由IO接口告知结果
三. 组合
- 同步阻塞: 调用IO接口后,线程一直等待并不停询问IO接口调用结果
- 同步非阻塞:调用IO接口后,线程可以做其它事,隔段时间询问IO接口调用结果
- 异步阻塞: 调用IO接口后,线程一直等待并等待IO接口返回结果
- 异步非阻塞:调用IO接口后,线程可以做其它事,由IO接口告知结果
回调或事件机制实现异步
四. 示例
以 小明点击下载按钮 为例
同步阻塞:如果小明点击下载按钮之后,就一直干瞪着进度条不做其他任何事情直到软件下载完成,这是同步阻塞;
异步阻塞:如果小明点击下载按钮之后,就一直干瞪着进度条不做其他任何事情直到软件下载完成,但是软件下载完成其实是会「叮」的一声通知的(但小明依然那样干等着),这是异步阻塞;
同步非阻塞:如果小明点击下载按钮之后,就去做其他事情了,不过他总需要时不时瞄一眼屏幕看软件是不是下载完成了,这是同步非阻塞;
异步非阻塞:如果小明点击下载按钮之后,就去做其他事情了,软件下载完之后「叮」的一声通知小明,小明再回来继续处理下载完的软件,这是异步非阻塞。