首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果捕获异常,ScheduledThreadPoolExecutor将停止执行

如果捕获异常,ScheduledThreadPoolExecutor将停止执行
EN

Stack Overflow用户
提问于 2017-08-30 17:30:19
回答 1查看 365关注 0票数 0

我有以下课程

代码语言:javascript
复制
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
  • 输出: FTPConnection id: 176220服务就绪。
  • ……
  • 输出: FTPConnection id: 190 226文件,存储135个字节。
  • 关闭数据套接字: FTP连接190,/0: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 //启动,但没有完成,再也没有运行
  • 输出: FTPConnection id:超过176221个超时,关闭控制和数据连接。
  • 关闭数据套接字: FTP连接176,/0:0:0:0:0:0:0:1:1407
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-03 12:22:38

结果,问题出在

代码语言:javascript
复制
 ACTIVECONNECTIONS.remove(connection);

我有ConcurrentModifyingException。http://code.nomad-labs.com/2011/12/09/mother-fk-the-scheduledexecutorservice/中的解决方案工作得很好

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45966488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档