根据 java.io/java.nio 进行阻塞

Blocking in terms of java.io/java.nio

我刚读过...

Classes that work with streams are located in two packages: java.io and java.nio. Classes from the former implement blocking of input/output (I/O): When bytes are being read/written by a process, they become unavailable for other threads of execution. The latter package offers non-blocking I/O with improved performance.

... 并且想更深入地了解这一点。阻塞是否只影响单个相关线程,但让源(即文件或数据库)本身不受阻塞,准备好被其他流访问?还是阻塞实际上阻止了源本身被访问,直到当前线程完成读取?

'Blocking' 表示您正在调用的 I/O 方法会阻塞调用线程,直到至少传输了一些数据,或者直到接受或连接操作成功或失败。

'Non-blocking' 表示如果无法传输任何数据,I/O 方法 return 会立即使用适当的 return 值或异常,或者连接操作在后台进行,稍后可以检查是否完成。

为了完整起见,'asynchronous' 表示 I/O 方法 return 立即执行,但该操作在后台继续,其结果可在适当的时候通过另一个调用获得,或者回调。

考虑您有 2 个线程的情况。两个线程都从单个套接字流中读取。这里我们关心的是我们正在读取的源字节以及我们需要根据 Multi-threading 进行检查。原因是由于Blocking I/O

  • 阻塞 I/O:这是 I/O 无限期地等待源的可用性。线程的执行在此时等待,它增加了应用程序 HangSlowness 的机会。 java.io 包就是这种类型的例子

  • 非阻塞I/O:这是I/O,它不会无限期地等待源,而是立即return。 java.nio 包就是这种类型的例子

阻塞基本上是指当线程调用 read() 或 write() 时,它会被阻塞而无法执行任何其他操作,直到有一些数据要读取或数据已写入。线程在此期间不能做任何其他事情。

所以阻塞是针对线程本身,而不是数据源。