注册时selector.wakeup意义模糊
来源:7-11 NIO服务器Thread优化-5
慕田峪8635452
2020-05-24
在register方法中对于selector.wakeup()的调用的意义不是很理解,如果不调用这个方法会产生什么问题,烦请老师深入介绍一下?一般在什么样的场景需要调用这个方法?谢谢老师答疑。
写回答
1回答
-
Qiujuer
2020-05-28
selector在进行select() 操作时会持续等待,并且会占用selector内部的队列锁。
当我们没有调用selector.wakeup(),直接进行register时,会出现我们register的线程持续等待的情况,因为register本质来说就是将我们的channel+key注册到selector的观察队列中。
但是目前队列已经被selector自身的锁给锁住了(操作内部的队列需要先得到锁才能进行,是互斥的),所以只要selector.select() 没有就绪事件产生,也就会一直占用,从而我们的新的Key也注册不进去。
selector.wakeup()的意义就在于强制唤醒selector.select(),不管当前有没有就绪事件都唤醒,并走后续的业务逻辑。既然会走后续的业务逻辑,所以selector.select()方法就结束了,并且释放了内部锁的占用。
从而让我们有机会将我们的channel+key注册到selector的观察队列中。
00
相似问题