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,等待線程執行完,同樣也不會報錯。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章