1.9 Java网络编程模型
1.9.1 阻塞I/O模型
阻塞I/O模型是常见的I/O模型,在读写数据时客户端会发生阻塞。阻塞I/O模型的工作流程为: 在用户线程发出I/O请求之后,内核会检查数据是否就绪,此时用户线程一直阻塞等待内存数据就绪;在内存数据就绪后,内核将数据复制到用户线程中,并返回I/O执行结果到用户线程,此时用户线程将解除阻塞状态并开始处理数据。典型的阻塞I/O模型的例子为data = socket.read(),如果内核数据没有就绪,Socket线程就会一直阻塞在read()中等待内核数据就绪。
1.9.2非阻塞I/O模型
非阻塞I/O模型指用户线程在发起一个I/O操作后,无需阻塞可以马上得到内核返回的一个结果。如果内核返回的结果为false,则表示内核数据还没有准备好,需要稍后在发起I/O操作。一旦内核中的数据准备好了,并且在次收到用户线程的请求,内核就会立刻将数据复制到用户线程并将复制的结果通知用户线程。
在非阻塞I/O模型中,用户线程需要不断询问内核数据是否就绪,在内核数据还未就绪时,用户线程可以处理其他任务,在内核数据就绪后可立即获取并执行相应的操作。典型的非阻塞I/O模型一般如下:
while(true){
data = socket.read();
if(data == true){ //1:内核数据就绪
//获取并处理内核数据
break;
}else{ //2.内核数据未就绪,用户线程处理其他业务
}
}
1.9.3多路复用I/O模型
多路复用I/O模型是指多线程并发编程用得较多的模型,Java NIO就是基于多路复用I/O模型实现的。在多路复用I/O模型中会有一个被称为Selector的线程不断轮训多个Socket的状态,只有在Socket有读写事件时,才会通知用户线程进行I/O操作。
剩下的略,讲这些够了。
1.9.4信号驱动I/O模型(略)
1.9.5异步I/O模型
在异步I/O模型中,用户线程会发起一个Asynchronous read操作到内核,内核在接收到Asynchronous read请求后立刻返回一个状态,来说明请求是否成功发起,在此过程中用户线程不会发生任何阻塞。接着,内核会等待数据准备完毕并将数据复制到用户
线程中,在数据复制完成后内核会发送一个信号到用户线程,通知用户线程Asynchronous读操作已完成。在异步I/O模型中,用户线程不需要关心整个I/O操作是如何进行的,只需发起一个请求,在接收到内核返回的成功或失败信号时说明I/O操作已经完成,直接
使用数据即可。
1.9.6Java I/O模型
在整个Java.io包中最重要的是5个类和1个接口。5个类指的是File、OutputStream、InputStream、Writer、Reader,1个接口指的是Serializable.具体的使用方法请参考JDK API
1.9.7Java NIO
Java NIO的实现主要三大核心内容:Selector(选择器)、Channel(通道)和Buffer(缓冲区)。
Java NIO 和 传统的 I/O的最大区别如下:
(1)I/O是面向流的,NIO是面向缓冲区的
(2)传统的I/O流操作是阻塞模型的,NIO的流操作是非阻塞模式的。