1 、在主线程统一轮询处理 select() 2 、子线程调用 register 注册通道。
register 会阻塞,无法往下执行。什么原因造成的呢?又该如何避免呢?各位有没有碰到过呢
1
dreamlike 2022-08-28 18:50:23 +08:00 via Android
有这个问题说明你应该是 j8 左右的版本,这个是内部实现问题 select 会持有和 register 相同的一把锁 具体请看
https://bugs.openjdk.org/browse/JDK-6446653 11 改了一次实现 就不会了 但是还是推荐 register 和 select 在同一个线程中执行,比如说先投递到 select 对应的线程队列中一个 register 任务 再调用 wakeup 让它从 select 中返回 |
3
atfeel OP @dreamlike 我也想把轮询和注册写在同一线程,但是注册完以后轮询是写在 while 里的,如果不写在新的线程里,那就是整个线程都堵塞在 select ,就没办法做其他操作了。
|
4
dreamlike 2022-08-28 22:04:58 +08:00 via Android 1
|