关于java NIO中 Chennal的阻塞在regist方法上的解决办法

news/2025/2/22 20:52:05

自己遇到了,研究了一下网上的帖子和oracle的文档。了解清楚后,发现其实解决方法很简单。

先说下阻塞的原因:Channelregist方法和Selector的select方法是需要获取相同的监视器。oracle文档关于Selector的select方法有这么一句话:

This method performs a blocking selection operation. It returns only after at least one channel is selected, this selector's wakeup method is invoked, or the current thread is interrupted, whichever comes first.

意思是“该方法执行阻塞选择操作。 只有在选择了至少一个通道,调用此选择器的唤醒方法,或者当前线程被中断(以先到者为准)时,它才会返回。”。因此,当没有任何通道时,除非唤醒或者被中断,否则不会返回,即:不会释放选择器。因此Channelregist方法就被阻塞住了。

知道了原因,解决起来很简单,用以下3种之一:

1、唤醒:调用Selector的wakeup方法

2、中断:interrupt Selector所在线程

3、在至少调用了一次Channelregist之后,再调用Selector的select。当然很显然,如果已经注册了一个通道,就不需要再保证这个顺序了。


http://www.niftyadmin.cn/n/743259.html

相关文章

2021年汽车修理工(初级)考试报名及汽车修理工(初级)考试总结

题库来源:安全生产模拟考试一点通公众号小程序 安全生产模拟考试一点通:安全生产模拟考试一点通:安全生产模拟考试一点通:汽车修理工(初级)考试报名考前必练!安全生产模拟考试一点通每个月更新…

android中彻底退出App的办法

所谓的“彻底退出App”的含义是包括释放所有App new出来的东西,比如说某些正在运行的线程、定时器之类的。 需要注意的是:finish()方法是作用于Activity,因此,即使finish了app的最后一个Activity&#xff…

2021年煤矿井下爆破考试题及煤矿井下爆破报名考试

题库来源:安全生产模拟考试一点通公众号小程序 安全生产模拟考试一点通:煤矿井下爆破考试题是安全生产模拟考试一点通总题库中生成的一套煤矿井下爆破报名考试,安全生产模拟考试一点通上煤矿井下爆破作业手机同步练习。2021年煤矿井下爆破考…

CSDN的用户密码策略到底是什么意思?

只能在已知旧密码的情况下才能修改密码。 也就是说,如果你忘记了密码,就永远别想改了。 很难理解这种非常奇葩设计到底是以什么为目标?难道是只想逼迫用户绑定手机、绑定第三方帐号登录?

2021年施工员-装饰方向-通用基础(施工员)考试报名及施工员-装饰方向-通用基础(施工员)考试资料

题库来源:安全生产模拟考试一点通公众号小程序 安全生产模拟考试一点通:施工员-装饰方向-通用基础(施工员)考试报名是安全生产模拟考试一点通总题库中生成的一套施工员-装饰方向-通用基础(施工员)考试资料,安全生产模拟考试一点通上施工员-装…

关于 Orange Pi 4g iot 的一些

最近用了橙子派的4g iot,折腾了好多天,有些东西值得记录一下。 1、关于连电脑的方式(通过板上miniusb连电脑的adb):首先要安装官方的驱动。官方只提供了win7&xp以及win8驱动。不过win10应该能够识别出来。其次&am…

2021年金属非金属矿井通风找解析及金属非金属矿井通风考试技巧

题库来源:安全生产模拟考试一点通公众号小程序 安全生产模拟考试一点通:安全生产模拟考试一点通:金属非金属矿井通风找解析是安全生产模拟考试一点通生成的,金属非金属矿井通风证模拟考试题库是根据金属非金属矿井通风最新版教材…

java:如何获取一周、一月、一年的第一天和最后一天

先说一年。 public static Calendar getFirstDayOfYear(Calendar c) {c.set(Calendar.DAY_OF_YEAR,1);return c; }public static Calendar getLastDayOfYear(Calendar c) {c.set(Calendar.DAY_OF_YEAR,1);c.add(Calendar.DAY_OF_YEAR,-1);c.add(Calendar.YEAR,1);return c; } …