Java 关闭钩子与 ExecutorService



我在关闭应用程序时遇到执行器服务已终止的问题......处理这个问题的好方法是什么?

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 ,可能是在应用程序开始退出时收到shutdownshutdownNow。当应用程序开始其关闭序列时,将触发addShutdownHook。因此,ExecutorService可能在启动 Shutdown 挂钩之前关闭。

相关内容

  • 没有找到相关文章

最新更新