Java ScheduledThreadPoolExecutor在捕获异常的情况下停止执行

Java ScheduledThreadPoolExecutor在捕获异常的情况下停止执行,java,exception,scheduledexecutorservice,Java,Exception,Scheduledexecutorservice,我有以下课程 public class MaintanceTools { public static final ScheduledThreadPoolExecutor THREADSUPERVISER; private static final int ALLOWEDIDLESECONDS = 1*20; static { THREADSUPERVISER = new ScheduledThreadPoolExecutor(10); }

我有以下课程

public class MaintanceTools {
    public static final ScheduledThreadPoolExecutor THREADSUPERVISER;
    private static final int ALLOWEDIDLESECONDS = 1*20;

    static {
        THREADSUPERVISER = new ScheduledThreadPoolExecutor(10);
    }
    public static void launchThreadsSupervising() {
        THREADSUPERVISER.scheduleWithFixedDelay(() -> {
            System.out.println("maintance launched " + Instant.now());
            ACTIVECONNECTIONS.forEach((connection) -> {
                try {
                    if ( !connection.isDataConnected() && 
                        (connection.getLastActionInstant()
                                .until(Instant.now(), SECONDS) > ALLOWEDIDLESECONDS)) {
                    connection.closeFTPConnection();
                    ACTIVECONNECTIONS.remove(connection);
                    }
                } catch (Throwable e) { }
            });
            System.out.println("maintance finished " + Instant.now());
        }, 0, 20, TimeUnit.SECONDS);
    }
}
它迭代所有FTP连接(因为我写FTP服务器),检查连接是否不传输任何数据,并且空闲一段时间,如果是,则关闭连接。 问题是,在中断线程中抛出一些异常后,任务永远不会运行。我知道它是用文档写的 如果任务的任何执行遇到异常,则会抑制后续执行。否则,任务将仅通过取消或终止执行者而终止。 我有一个例外,但它是被抓到的,并且没有超出投掷功能。 此函数引发AsynchronousCloseException,因为它挂起在channel.read(readBuffer)上;当连接关闭时,抛出并捕获异常

问题是如何使THREADSUPERVISER在不考虑任何抛出和处理的异常的情况下工作

调试输出:

  • 维护启动2017-08-30T14:03:05.504Z//按预期启动并完成
  • 维护完成2017-08-30T14:03:05.566Z
  • 输出:FTP连接id:176 220服务就绪
  • 输出:FTP连接id:190 226文件存储135字节
  • 正在关闭数据套接字:FTP连接190,/0:0:0:0:0:0:1:1409
  • 维护启动2017-08-30T14:03:25.581Z//按预期启动并完成
  • 维护完成2017-08-30T14:03:25.581Z
  • 异步异常读取错误。//破例
  • 维护已启动2017-08-30T14:03:45.596Z//已启动,但未完成,且不再运行
  • 输出:FTP连接id:176 221超时,关闭控制和数据连接
  • 正在关闭数据套接字:FTP连接176,/0:0:0:0:0:0:1:1407

事实证明,问题出在

 ACTIVECONNECTIONS.remove(connection);

我同意修改例外情况。中的解决方案工作得很好

事实证明,问题出在

 ACTIVECONNECTIONS.remove(connection);
我同意修改例外情况。这个解决方案非常有效