NIO的java.nio.channels.CancelledKeyException几种解决方法

今天项目报出一个错,导致了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,等待线程执行完,同样也不会报错。

猜你喜欢

转载自blog.csdn.net/zyb112211/article/details/50801570
今日推荐