NIO,BIO,非阻塞,阻塞?到底怎么理解呢?
分析
-
客户端
对于客户端来说,无论如何都是阻塞的,客户端发送请求到服务端后,就会等待结果返回,此时两种处理方式。
1)客户端线程阻塞住,等待返回
2)客户端引入异步措施(相对同步而言,使用类似Future的功能实现),但这个不能说客户端不是阻塞的。(阻塞和非阻塞,异步和同步是不同纬度的概念)
-
服务端
对于服务端来说,如果是BIO,那么接到客户端请求后,立刻启动一个线程来处理这个请求。在处理过程中,这个线程是阻塞的,它必须等待网络IO传输完毕,才能做下面的事情。在这个等待过程中,这个线程是不能做其他事情的。
注意,这里的线程模型是一个客户端请求来了后,就有一个服务端线程伺候着。显然不符合高并发的场景。
而对于NIO,处理请求的线程在不停的监听客户端的请求,一旦有了新请求过来,就把这个请求纳入到监听列表中去,并不停地监听这个列表,看这个列表中是否有数据传输完毕的请求,如果有,则立刻处理(这个监听可以分发到任意多的线程中)。
注意,此时的线程模型跟BIO是截然不同的。客户端的多个请求,被映射到了服务端的一个线程中去。这个线程的使用效率明显得到了提高,很适合高并发的使用场景。
结论
从这个意义上来说,所谓NIO,非阻塞,主要还是针对服务端中的处理线程来说的。