【问题标题】:Gracefully shutting down a Java task which contains a connection优雅地关闭包含连接的 Java 任务
【发布时间】:2017-01-18 14:00:55
【问题描述】:

我有许多由执行器服务管理的可运行任务。

这些任务本质上是 JMS 队列轮询器并包含它们自己的连接。

例如:

ExecutorService executor = Executors.newFixedThreadPool(...);
executor.submit(new MyListener());

我的听众:

public class MyListener implements Runnable {
    @Override
    public void run() {
        // Create my JMS connection here
    }
}

如何优雅地关闭每个任务中的 JMS 连接,然后继续关闭每个线程?

我在使用shutdown() 关闭执行程序服务时遇到问题。

我需要使用shutdownNow() 强制中断,但是,如果我没有明确调用.close(),我如何确定我的JMS 连接已经关闭?

我是否缺少允许在我尝试停止任务时执行关闭挂钩的界面?

【问题讨论】:

    标签: java connection runnable executorservice shutdown


    【解决方案1】:

    这是我利用原子布尔值的建议优雅地关闭持有连接的线程的解决方案:

    MyRunnable implements Runnable {
    
        private volatile boolean isActive = true;
    
        public void run() {
           while(isActive && !Thread.currentThread().isInterrupted()) {
               ...
           }
        }
    
        public void stop() {
            isActive = false;
        }
    }
    

    主线程:

    private void myShutdownHook() {
        myRunnableInstance.stop();
    
        // Can safely shutdown executor now...
    }
    

    【讨论】:

      【解决方案2】:

      最简单的方法是使用类共享的原子布尔值,该类表示关闭和可运行文件。这告诉他们停下来。另一种选择是自己找到线程并中断它们。您需要捕获中断的异常并关闭连接。您可以在可运行的启动时设置线程名称以便于识别。

      【讨论】:

        猜你喜欢
        • 2021-06-03
        • 2015-06-25
        • 1970-01-01
        • 1970-01-01
        • 2012-10-29
        • 2019-06-27
        • 1970-01-01
        • 2011-08-07
        • 2012-04-05
        相关资源
        最近更新 更多