正常关闭包含连接的Java任务

时间:2017-01-18 14:00:56

标签: java connection runnable executorservice shutdown

我有许多由执行服务管理的Runnable任务。

这些任务本质上是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连接已关闭?

我是否缺少一个允许在我尝试停止任务时执行关闭挂钩的接口?

2 个答案:

答案 0 :(得分:0)

最简单的方法是使用由发出shutdown和runnable信号的类共享的原子布尔值。这告诉他们要停下来。另一个选择是自己找到线程并中断它们。您需要捕获中断的异常并关闭连接。您可以在runnable launch for easy id。

时设置线程名称

答案 1 :(得分:0)

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

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...
}