知乎专栏: 关于Vert.x你需要知道的一切
为了能更好的理解vert.x的线程模型,我们必须要先明确几个概念:同步(Synchronous)和异步(Asynchronous),阻塞(Blocking)和非阻塞(Non-Blocking)。关于这几个名词的解释网络上也是众多纷纭,每个人说法都不太一样,但说的又似乎很有道理。其实造成这种情况的最主要原因是这四个概念并不是完全隔离、互斥的,而是相互之间有重叠。例如,当提到异步时那调用一定是非阻塞的,提到同步时则一定会有阻塞调用,此谓之重叠;然而如果我们在谈异步,那在调用方的角度来看是一定不存在阻塞的情况发生的,此谓之互斥。下面我们详细聊聊对于这几个名词大家应该如何理解。
我们以在单线程环境下调用功能为读取文件内容的方法readFile(filename)
为例来模拟一下都会发生什么:
- 阻塞
调用此方法后主线程进入阻塞状态,期间不能执行任务操作,一直到readFile()
返回才能继续执行后面的代码。
- 非阻塞
调用此方法后,readFile()
立刻返回,主线程可以继续执行后面的代码而不需要等待磁盘I/O操作完成。但这里会产生一个问题,主线程怎么才能知道readFile()
是否完成?是会有人通知这一事件,还是主线程主动去轮询呢?
- 同步
其实同步/异步是一个比阻塞/非阻塞更加广泛的概念。我们在说阻塞时,一定是在描述某种I/O操作,比如文件读写