花莲县网站建设_网站建设公司_全栈开发者_seo优化
2025/12/21 7:48:32 网站建设 项目流程

Java程序中使用SSHD库时,如果开启了多次SshClient,在第二次关闭SshClient的时候会报出以下的堆栈错误:

Exception in thread "Thread-2" java.lang.IllegalStateException: Executor has been shut down at org.apache.sshd.common.util.ValidateUtils.createFormattedException(ValidateUtils.java:234) at org.apache.sshd.common.util.ValidateUtils.throwIllegalStateException(ValidateUtils.java:228) at org.apache.sshd.common.util.ValidateUtils.checkState(ValidateUtils.java:205) at org.apache.sshd.common.util.threads.NoCloseExecutor.execute(NoCloseExecutor.java:100) at java.base/sun.nio.ch.AsynchronousChannelGroupImpl.executeOnPooledThread(AsynchronousChannelGroupImpl.java:178) at java.base/sun.nio.ch.Invoker.invokeIndirectly(Invoker.java:195) at java.base/sun.nio.ch.Invoker.invoke(Invoker.java:171) at java.base/sun.nio.ch.Invoker.invoke(Invoker.java:280) at java.base/sun.nio.ch.WindowsAsynchronousSocketChannelImpl$ReadTask.failed(WindowsAsynchronousSocketChannelImpl.java:587) at java.base/sun.nio.ch.Iocp$EventHandlerTask.run(Iocp.java:389) at java.base/java.lang.Thread.run(Thread.java:1447)

而且每次都是稳定的是同一个线程Thread-2崩溃掉的,查阅相关资料发现,这可能是存在于Windows JDK中的一个bug,目前是一直处于未解决的状态。

  • https://bugs.openjdk.org/browse/JDK-7056546
  • https://stackoverflow.com/questions/14073554/correct-behavior-from-nio-2-asynchronousserversocketchannel-accept-on-windows
  • https://github.com/apache/mina-sshd/issues/409

同时,由于这是从线程里面崩溃掉的,没有外部的调用链,无法直接从外部直接捕获这个错误,而同时,这个错误并不会直接影响到程序运行,只是这个错误会出现在终端的打印里面,影响了显示。

因此,本文将通过设置Thread的默认错误处理器,以便捕获这个错误,使其不会让用户知道这样的错误。我们只需要在整个程序的入口出,添加以下代码,即可为所有线程添加默认的错误处理器,可以在这个方法中添加需要的逻辑,以便正确处理这个错误。

Thread.setDefaultUncaughtExceptionHandler{_:Thread?,_:Throwable?->}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询