参考答案:
阻塞(Blocking) 和 非阻塞(Non-blocking) 是描述程序在执行输入/输出(I/O)操作时,线程与操作之间的交互方式。它们的区别在于 线程是否会等待 I/O 操作完成,以及 程序是否会继续执行其他任务。
定义:在阻塞模式下,线程执行某个 I/O 操作时,如果操作无法立即完成(比如没有数据可以读取或无法写入),该线程会被阻塞,直到操作完成,才会继续执行后续代码。也就是说,线程会停下来等待 I/O 操作的结果。
行为:
例子:
InputStream.read()
或 OutputStream.write()
,如果没有数据可读取,程序会一直阻塞,直到数据变得可用。优缺点:
定义:在非阻塞模式下,线程执行 I/O 操作时,如果操作无法立即完成(比如没有数据可读取),线程 不会被阻塞,而是立即返回。线程可以继续执行其他任务,直到 I/O 操作完成时,系统通过某种机制(例如回调、事件通知)告知线程操作已完成。
行为:
例子:
SocketChannel
和 FileChannel
,通过设置为非阻塞模式,执行 read()
或 write()
时,如果数据不可用,方法不会阻塞线程,而是返回一个特殊值(如 -1
或 0)表示当前没有可用数据,线程可以选择继续执行其他任务,或者再次检查数据。优缺点:
特性 | 阻塞(Blocking) | 非阻塞(Non-blocking) |
---|---|---|
操作行为 | 线程发起 I/O 操作后,会等待直到操作完成。 | 线程发起 I/O 操作后,如果操作无法立即完成,线程立即返回,不会阻塞。 |
线程状态 | 线程会被挂起,直到 I/O 操作完成。 | 线程不会被挂起,可以继续做其他事情。 |
适用场景 | 适用于并发性要求不高的场景,或 I/O 操作较少的程序。 | 适用于高并发 I/O 操作的场景,例如高性能服务器、实时应用。 |
编程复杂度 | 编程较简单,直接处理 I/O 操作结果。 | 编程复杂,需要使用事件驱动或轮询等方式来处理 I/O 操作的结果。 |
性能影响 | 线程可能会长时间阻塞,导致 CPU 利用率低。 | 更高效的资源使用,避免了 CPU 等待 I/O 操作。 |
阻塞模式:
非阻塞模式:
SocketChannel
或 FileChannel
。最近更新时间:2024-12-24