NIO 的疑惑,多线程下调用 register 阻塞,是什么原因呢?

2022-08-28 10:07:50 +08:00
 atfeel

1 、在主线程统一轮询处理 select() 2 、子线程调用 register 注册通道。

register 会阻塞,无法往下执行。什么原因造成的呢?又该如何避免呢?各位有没有碰到过呢

8648 次点击
所在节点    Android
5 条回复
dreamlike
2022-08-28 18:50:23 +08:00
有这个问题说明你应该是 j8 左右的版本,这个是内部实现问题 select 会持有和 register 相同的一把锁 具体请看
https://bugs.openjdk.org/browse/JDK-6446653
11 改了一次实现 就不会了
但是还是推荐 register 和 select 在同一个线程中执行,比如说先投递到 select 对应的线程队列中一个 register 任务 再调用 wakeup 让它从 select 中返回
atfeel
2022-08-28 20:47:00 +08:00
@dreamlike 大佬,你说 j8 是 java8 吗?还是 jdk8 呢?
atfeel
2022-08-28 21:07:32 +08:00
@dreamlike 我也想把轮询和注册写在同一线程,但是注册完以后轮询是写在 while 里的,如果不写在新的线程里,那就是整个线程都堵塞在 select ,就没办法做其他操作了。
dreamlike
2022-08-28 22:04:58 +08:00
atfeel
2022-08-29 10:45:16 +08:00
@dreamlike 太牛了,昨天我也式了唤醒再注册这种方式,测试结果是,网络请求比直接同步请求多了 20ms,想不到这个 class 这么全面,大佬果然牛!!!仰望感谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/875927

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX