关键代码片段
import java.nio.channels.SocketChannel;
import java.io.IOException;
public class NonBlockingSocketChannelExample {
public static void main(String[] args) {
try {
SocketChannel socketChannel = SocketChannel.open();
// 设置为非阻塞模式
socketChannel.configureBlocking(false);
} catch (IOException e) {
e.printStackTrace();
}
}
}
非阻塞模式与阻塞模式的主要区别
- 阻塞模式:
- 当一个线程执行到一个阻塞操作时(例如在
SocketChannel
中进行read
或write
操作),该线程会被挂起,直到操作完成。比如在进行read
操作时,如果没有数据可读,线程会一直等待,这期间该线程无法执行其他任务,会占用系统资源。
- 这种模式在单线程应用中比较简单直接,但在处理多个连接时,由于每个连接的操作可能会阻塞线程,导致整体效率低下,无法充分利用系统资源。
- 非阻塞模式:
- 在非阻塞模式下,当线程执行到一个操作时,如果操作不能立即完成(例如
read
时没有数据可读),线程不会被挂起,而是立即返回一个状态值,表明操作的结果(比如返回 -1 表示没有数据可读)。
- 线程可以继续执行其他任务,从而可以同时处理多个连接。这种模式通常需要结合多路复用器(如Java NIO中的
Selector
)来高效管理多个非阻塞的SocketChannel
,大大提高了系统的并发处理能力。