注册时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的观察队列中。


0
0

Socket网络编程进阶与实战 系统掌握Socket核心技术

理论+实践,系统且深入掌握Socket核心技术,从容应对各种Socket应用场景的不二之选

2324 学习 · 476 问题

查看课程