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