今天项目报出一个错,导致了Socket监听停止,错误如下:
java.nio.channels.CancelledKeyException at sun.nio.ch.SelectionKeyImpl.ensureValid(SelectionKeyImpl.java:55) at sun.nio.ch.SelectionKeyImpl.readyOps(SelectionKeyImpl.java:69) at java.nio.channels.SelectionKey.isAcceptable(SelectionKey.java:342) at mainll2.main(mainll2.java:62)
错误位置 :key.isAcceptable()
错误原因:
我在线程里把通道关闭时,监听会捕获一个键,但这个键是无效的,在用这个键去做判断时,就会报出上面那个错。
下面是我在测试过程中得出的几种解决方法:
1、在关闭通道之前要记得把键cancel掉。
2、在从迭代中取出键的后,先判断一下key的有效性,无效的continue掉。
3、给迭代套上try-catch,捕获异常,这样怎么都不会影响监听停止了。
我在测的时候发现,如果给线程加上同步,就是join,等待线程执行完,同样也不会报错。