阻塞/非阻塞/异步/同步

来源:互联网 发布:备份通讯录的软件 编辑:程序博客网 时间:2024/05/29 04:43

最近去面试,面试让我描述JAVA IO的三种方式:阻塞,非阻塞,异步。当时我有点儿懵了,异步怎么和阻塞,非阻塞并列了。阻塞和非阻塞是一组相对的概念,异步是和同步相对的概念。

同步

所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。按照这个定义,其实绝大多数函数都是同步调用。


异步

异步的概念和同步相对。当一个异步过程调用发出后,调用者不用等待得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。

阻塞

阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。很多人会把阻塞和同步混淆,实际上它们是不同的。对于同步调用来说,很多时候当前线程还是active的,只是当前函数没有返回而已。例如,我们在CSocket中调用Receive函数,如果缓冲区中没有数据,这个函数就会一直等待,直到有数据才返回。而此时,当前线程还会继续处理各种各样的消息。如果主窗口和调用函数在同一个线程中,除非你在特殊的界面操作函数中调用,其实主界面还是应该可以刷新。socket接收数据的另外一个函数recv则是一个阻塞调用的例子。当socket工作在阻塞模式的时候,如果没有数据的情况下调用该函数,则当前线程就会被挂起,直到有数据为止。

非阻塞

非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。

同步/异步是下, API 通知被调用者的通知方式。阻塞/非阻塞则是 API 调用者的等待方式。

在不同的场景下,同步/异步、阻塞/非阻塞的四种组合都有应用。

同步阻塞

同步阻塞是最简单的方式,常见的调用一个函数并等待其返回。

同步非阻塞

同步非阻塞就是 发出调用请求后,每隔一段时间查询一下执行进度的 的轮询(polling)方式。

异步非阻塞

异步非阻塞,就是把一件事丢到 “后台” 去做,完成之后再通知。

异步阻塞

被调用者异步通知,但是调用者还是不放心,要盯着一直等到返回。这种看上去很傻的方式主要在某些API只提供异步通知的场合,但是业务逻辑又要求阻塞,做完一件事才能再做另外一件事。

0 0