这篇主要是纯理论讨论。
首先在上一篇中,可以通过多线程的方式,简单的处理因为BIO的单线程的问题。但是使用多线程的问题这里也不在赘述了。
如何使用单线程将IO变成非阻塞
在单线程中,因为accept方法和read方法会导致线程阻塞,那解决的主要突破点就是在这里了。
解决accept方法阻塞
大胆想象,可不可以将这个连接的socket对象放入一个集合或者数组中。意思就是将已连接的对象,放入一个容器中,不再是使用那种如果没有客户端连接,就一直阻塞。
然后服务端通过这个容器,来管理连接的客户端。
解决read方法阻塞
服务端现在通过一个容器管理已经连接的客户端,客户端发送消息,服务端只有轮询遍历,然后输出数据。
这个意思就是服务端使用容器,在不断的遍历,然后读数据,如果有数据就处理,如果没数据,就继续遍历下一个客户端。
这样解决关于read方法的阻塞问题
使用选择器的非阻塞IO
看图
通过一个选择器,可以在任何的时间以单线程的方式检查任意的读操作或者写操作的完成状态来选择使用的socket。一个单一的线程便可以处理多个并发的连接。
简单的说,这个选择器,就是多路复用器。监听来自多个客户端的I/O事件。
这种方式就是NIO,与BIO模型相比,这种模型提供了更好的资源管理。
- 使用较少的线程便可以处理许多连接,因此减少了内存管理和上下文切换所带来的开销;
- 当没有I/O操作需要处理时,线程可以被用于其他任务。
学习来源《Netty实战》
评论区