线程池里面取消对事件的监听?

来源:7-10 NIO服务器Thread优化-4

慕的地0074987

2020-06-03

图片描述
这里老师进行了取消注册 取消对keyOps的监听,取消监听是为了防止下次select把已经可以读的事件重复拿出来丢给线程池 那在started这个方法里的for循环 如果把就绪的事件拿到之后 肯定是循环结束才退出 这样就把已经就绪的事件处理了 为什么还要取消监听呢!我有点蒙蔽了

写回答

1回答

Qiujuer

2020-06-07

是这样的:

  1. 事件会触发就绪,代表可以进行数据输入输出操作

  2. 此时我们将数据操作放到了线程池,也就是异步进行

  3. 所以当前的select线程不会阻塞,会循环完成后直接进行下一次的select操作,此时若线程的执行还没进行,那么将会再次得到当前通道就绪,所以当前线程又会给线程池丢一个任务。

  4. 从而导致线程池中有多个同样的任务,比如A通道读取就绪,那么此时线程池有>1个任务。

  5. 当多线程并发运行的时候,此时也就是有几个线程同时进行数据读取,将会导致每个线程得到的数据都不是完整的,从而导致数据混乱问题

0
0

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

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

2314 学习 · 476 问题

查看课程