我有许多由执行服务管理的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连接已关闭?
我是否缺少一个允许在我尝试停止任务时执行关闭挂钩的接口?
答案 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...
}