BIO NIO AIO

BIO: 同步阻塞IO,一个连接一个线程

NIO:同步非阻塞,一个请求一个线程

AIO:异步非阻塞,一个有效请求一个线程

BIO:

java1.4以前,一个网络请求,就要建立一个socket,这时候一个socket连接就要询问是否有线程可以处理,如果没有就等待,要么就拒绝。一个连接要求server对应一个线程处理。

NIO

本身基于事件驱动的思想完成,解决BIO的大并发问题:在同步IO的网络应用中,如果要同时处理多个客户请求,或是在客户端要同时和多个服务器通讯,就必须使用多线程来处理。将每一个客户端的连接请求都要一个线程来单独处理。

问题:每创建一个线程,就要为这个线程分配一定的内存空间(JVM提供)同时操作系统也有对线程总数上限要求。请求过多名服务器程序就可能因为不堪重负而拒绝客户端请求宕机或者瘫痪。

NIO基于Reactor,当socket有流读或者写时,操作系统会通知应用程序处理,应用在将流读取到缓冲区或者写入操作系统。

扫描二维码关注公众号,回复: 292834 查看本文章

也就是说,这个时候已经不是一个socket对应一个线程,而是一个请求对应一个线程,当连接没有数据,是没有线程来处理的。

AIO

与NIO不同,当进行读写操作时,只需要直接调用API的read和write方法,这两种方法都是异步的。

对于读操作,有流读操作时候,操作系统将流传入read方法的缓冲区,通知应用程序,写操作,操作系统将write方法传递的流写入完毕时,操作系统主动通知应用程序。

可以理解为:read和write都是异步的,完成后会主动调用回调函数。

java1.7中,在java.net.channels包下四个异步通道

AsynchronousSocketChannel

AsynchronousServerSocketChannel

AsynchronousFileChannel

AsynchronousDataframChannel回调函数。

调用read/write方法会同时返回调用函数对象,当执行完,立即调用。

猜你喜欢

转载自flycw.iteye.com/blog/2394036