java非阻塞中断_java中的nio非阻塞线程可以去干什么别的事?

首先要知道,计算机的思维和你的思维非常不同。

你的视角是「一个循环不断看缓冲区」,计算机的视角是「这个循环只在一条线程上运行,可以同时查看多个连接的缓冲区」。

要知道计算机中CPU属于高速设备,网卡(IO)属于低速设备,要给网卡发数据,过程必然是「异步」的,也就是CPU根本不会等待网卡的响应。那为什么我们使用过程中BIO(Blocking IO)可以给我们提供一个同步的API?

答案是线程。

系统在向网卡请求写完数据之后,把socket和当前线程绑定在了一起,然后让线程进入挂起状态,直到网卡收到数据触发中断,系统重新找到与对应socket绑定的线程然后唤醒。

这里就涉及到了一个线程上下文恢复的过程了,这个过程涉及系统调用,系统调用花销非常大。这就导致了你服务器处理请求的能力直接与系统调用的性能相关。

这时回到NIO,NIO在处理请求上是「多路复用」,这里复用是指「多路」连接「复用」同一线程。系统不再挂起处理线程,而是直接在你数据区内放入对应的select-key,让你自己区轮询,这样看似操作更多,实际上解开了请求处理和系统调用的直接相关性,避免了线程切换带来的开销。

当然,NIO在数据拷贝过程还是阻塞的,这里需要用mmap/direct buffer解决,涉及ZeroCopy相关的知识就不拓展了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值