美文网首页想法简友广场
今天我们就来聊一聊Java的非阻塞通信技术

今天我们就来聊一聊Java的非阻塞通信技术

作者: ITWYY | 来源:发表于2020-10-19 14:12 被阅读0次

前几天刚学完非阻塞,但课上听完还是挺迷茫的。所以课下自己找一些相关的书籍自己领悟,今天就把自己感悟 的经验分享 给大家。

非阻塞的的基本思想

假如同时要做两件事:烧开水和煮粥。烧开水的步骤如下:

煮粥的步骤如下:

为了同时完成两件事,一种方案是同时请两个人分别做其中的一件事,这相当于采用多线程来同时完成多个任务。还有一种方案是让一个人同时完成两件事,这个人应该善于利用一件事的空闲时间去做另一件事,这个人一刻也不应该闲着。

这个人不断监控烧水和煮粥的状态,如果发生了“水烧开”“粥煮开”或“粥煮熟”事件,就去处理这些事件,处理完一件事后继续监控烧水和煮粥的状态,直到所有的任务都完成。

非阻塞通信四大主要类

·ServerSocketChannel:ServerSocket的替代类,支持阻塞通信与非阻塞通信。

·SocketChannel:Socket的替代类,支持阻塞通信与非阻塞通信。·

Selector:为ServerSocketChannel监控接收连接就绪事件,为SocketChannel监控连接就绪、读就绪和写就绪事件。·

SelectionKey:代表ServerSocketChannel以及SocketChannel向Selector注册事件的句柄。当一个SelectionKey对象位于Selector对象的selected-keys集合中,就表示与这个SelectionKey对象相关的事件发生了。

SelectionKey类的一些静态常量表示事件类型。

ServerSocketChannel只可能发生一种事件。·

SelectionKey.OP_ACCEPT:接收连接就绪事件,表示至少有了一个客户连接,服务器可以接收这个连接。

SocketChannel可能发生以下3种事件。

·SelectionKey.OP_CONNECT:连接就绪事件,表示客户与服务器的连接已经建立成功。·SelectionKey.OP_READ:读就绪事件,表示输入流中已经有了可读数据,可以执行读操作了。·SelectionKey.OP_WRITE:写就绪事件,表示已经可以向输出流写数据了。SocketChannel提供了接收和发送数据的方法。


提起非阻塞,又不得不提到缓冲区,非阻塞采用的是通道连接,使用缓冲区交换数据。

而阻塞通信采用是io流交换数据,这也是两者的区别。

缓冲区的属性

·容量(capacity):表示缓冲区可以保存多少数据。·

极限(limit):表示缓冲区的当前终点,不能对缓冲区中超过极限的区域进行读写操作。极限是可以被修改的,这有利于缓冲区的重用。例如,假定容量为100的缓冲区已经填满了数据,接着程序在重用缓冲区时,仅仅将10个新的数据写入缓冲区中从位置0到10的区域,这时可以将极限设为10,这样就不能读取位置从11到99的原先的数据了。极限是一个非负整数,不应该大于容量。

·位置(position):表示缓冲区中下一个读写单元的位置,每次读写缓冲区的数据时,该值都会改变,为下一次读写数据做准备。位置是一个非负整数,不应该大于极限。

缓冲区提供了用于改变以上3个属性的方法:

·clear():把极限设为容量,把位置设为0。·

flip():把极限设为位置,把位置设为0。

·rewind():不改变极限,把位置设为0。

服务器端示例

相关文章

网友评论

    本文标题:今天我们就来聊一聊Java的非阻塞通信技术

    本文链接:https://www.haomeiwen.com/subject/smpkmktx.html