到现在为止,它已经很老了,很少有人记得Java在1.4之前是什么样子的,这是你需要知道的,以便理解的“为什么”。NIO
NIO
简而言之,在Java 1.3之前,所有I / O都是阻塞类型。更糟糕的是,没有模拟系统调用多路复用I/O。因此,用Java实现的服务器别无选择,只能采用“每个连接一个线程”的服务策略。select()
在Java 1.4中引入的NIO的基本要点是使Java中可用的传统UNIX风格多路复用非阻塞I / O的功能。如果您了解如何对一组文件描述符(通常是套接字)进行编程或检测 I/O 就绪情况,那么您将在中找到所需的服务:您将使用 s 表示非阻塞 I/O 端点,s 用于 fdset 或 pollfd 数组。具有线程池或具有处理多个连接的线程的服务器现在成为可能。这就是“额外”。select()
poll()
NIO
SocketChannel
Selector
A 是非阻塞套接字 I/O 所需的字节数组,尤其是在输出/写入端。如果只能立即写入缓冲区的一部分,则使用阻塞 I/O,您的线程将简单地阻塞,直到可以写入整个缓冲区。使用非阻塞 I/O,您的线程将获得写入量的返回值,由您来处理下一轮的剩余部分。A 通过显式实现用于填充和排出的生产者/消费者模式来处理这些机械细节,可以理解您的线程和 JVM 的内核将不同步。Buffer
Buffer