香港马会挂牌正版彩图 > 香港九龙挂牌解特 >
香港九龙挂牌解特

对java中BIO与NIO、AIO的差异(这个容易理解)

时间: 2018-12-24

二、NIO

IO的方式通常分为多少种,同步梗阻的BIO、同步非阻塞的NIO、异步非阻塞的AIO。

在 JDK1.4出来之前,我们建破网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSocket,而后在客户端启动Socket来对服务 端进行通信,默认情况下服务端须要对每个请求建立一堆线程等待请求,而客户端发送请求后,先咨询服务端是否有线程相应,如果没有则会始终等待或者受到谢绝 请求,如果有的话,客户端会线程会等候请求结束后才连续实行。

一、BIO

NIO基于Reactor,当socket有流可读或可写入socket时,操作系统会相应的告知引用程序进行处理,应用再将流读取到缓冲区或写入操作系 统。 也就是说,这个时候,已经不是一个连接就要对应一个处理线程了,而是有效的请求,对应一个线程,当连接不数据时,是不工作线程来处理的。

NIO 自身是基于事件驱动思维来实现的,其主要想解决的是BIO的大并发问题: 在应用同步I/O的网络应用中,如果要同时处理多个客户端要求,或是在客户端要同时跟多个服务器进行通讯,就必须利用多线程来处理。也就是说,将每一个客 户端请求调配给一个线程来单独处置。这样做诚然能够达到咱们的请求,但同时又会带来另外一个问题。由于每创立一个线程,就要为这个线程调配必定的内存空间 (也叫工作存储器),而且操作体系本身也对线程的总数有一定的限度。假如客户端的恳求过多,服务端程序可能会因为不堪重负而拒绝客户真个请求,甚至服务器 可能会因此而瘫痪。

BIO与NIO一个比较重要的不同,是咱们使用BIO的时候往往会引入多线程,每个衔接一个独自的线程;而NIO则是使用单线程或者只使用少量的多线程,每个连接共用一个线程。

NIO的最重要的地方是当一个连接创建后,不需要对应一个线程,这个连接会被注册到多路复用器上面,所以所有的连接只有要一个线程就可能搞定,当这个线程 中的多路复用器进行轮询的时候,发现连接上有请求的话,才开启一个线程进行处理,也就是一个请求一个线程模式。