我在关闭应用程序时遇到执行器服务已终止的问题......处理这个问题的好方法是什么?
public class TradingLock {
private ExecutorService executorService;
private List<TradingHaltedListener> listeners=new ArrayList<>();
public TradingLock(ExecutorService executorService) {
super();
this.executorService = executorService;
}
public void haltTrading(){
for (final TradingHaltedListener listener: listeners){
executorService.execute(new Runnable() {
@Override
public void run() {
listener.onTradingHalted();
}
});
}
}
public synchronized void addTradingHaltedListener(TradingHaltedListener listener){
this.listeners.add(listener);
}
}
主类的关闭钩子:
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
tradingLock.haltTrading();
}
});
我发现,如果我创建一个扩展 Thread 的类并在 addShutdownHook
函数中使用它,它就可以毫无问题地运行。
public class ShutdownHandler extends Thread {
public void run(){
// do all the work to clean up before shutting down
}
}
然后只需将其添加到主类中即可
Runtime.getRuntime().addShutdownHook(new ShutdownHandler());
编辑
阅读更多关于 ExecutorService
,可能是在应用程序开始退出时收到shutdown
或shutdownNow
。当应用程序开始其关闭序列时,将触发addShutdownHook
。因此,ExecutorService
可能在启动 Shutdown 挂钩之前关闭。