今天突发奇想写了一下selector和socketChannel的几行代码,对channel和selector有了一些比较有意思的理解。
其实今天感悟的是selector解决的根本性问题,解决的是网络程序的连接数量问题,在没有出现这个技术之前,一个连接需要有一个线程维持连接,占用资源多,连接越多,开启的线程越多。
而使用selector却可以使用一个线程来维持很多连接,减轻了操作系统的线程的占用,有效提高了执行效率。
从jdk提供的api来看,socketChannel需要注册一个selector,然后对selector进行死循环式的不断的探测,看是否有读,写,连接,被连接等四种事件的发生。
这样,将以前一个线程维护一个连接的阻塞,改为了很多个连接的只需要最多阻塞一个线程。
实际上,selector只是采集socketChannel的一些事件,而这些事件本身的处理,还是需要通过socketChannel来进行,因为:
1.实际上,socketChannel才是网络协议栈存放数据的根本地方,才是网络协议栈发送数据的源头。
2.网络协议栈操作最终还是socketChannel,而selector仅仅是操作完成之后,发给selector一个通知而已。
明白了这些,就明白了selector和socketChannel的作用了。
selector是一种被动接受socketChannel四种事件的组件,依赖此组件,我们知道了某个socketChannel具有了我们需要处理的事件,我们采取行动,从socketChannel操作从而应对这个事件的发生。
socketChannel是网络连接的抽象,具有读写等功能。仅此而已罢了。