0

アプリケーションをシャットダウンするときに、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();
        }
    });
4

1 に答える 1

1

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、シャットダウンフックが開始される前にがシャットダウンされる可能性があります。

于 2012-07-02T11:38:07.800 に答える