线程池里面取消对事件的监听?
来源:7-10 NIO服务器Thread优化-4
慕的地0074987
2020-06-03
这里老师进行了取消注册 取消对keyOps的监听,取消监听是为了防止下次select把已经可以读的事件重复拿出来丢给线程池 那在started这个方法里的for循环 如果把就绪的事件拿到之后 肯定是循环结束才退出 这样就把已经就绪的事件处理了 为什么还要取消监听呢!我有点蒙蔽了
写回答
1回答
-
Qiujuer
2020-06-07
是这样的:
事件会触发就绪,代表可以进行数据输入输出操作
此时我们将数据操作放到了线程池,也就是异步进行
所以当前的select线程不会阻塞,会循环完成后直接进行下一次的select操作,此时若线程的执行还没进行,那么将会再次得到当前通道就绪,所以当前线程又会给线程池丢一个任务。
从而导致线程池中有多个同样的任务,比如A通道读取就绪,那么此时线程池有>1个任务。
当多线程并发运行的时候,此时也就是有几个线程同时进行数据读取,将会导致每个线程得到的数据都不是完整的,从而导致数据混乱问题
00
相似问题