2012-07-02 3 views
0

У меня возникла проблема при закрытии моего приложения, что ExecutorService было прекращено ... Что такое хороший способ справиться с этим?Java shutdown hooks с 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); 
    } 
} 

Shutdown крюк от основного класса:

Runtime.getRuntime().addShutdownHook(new Thread() { 
     public void run() { 
      tradingLock.haltTrading(); 
     } 
    }); 

ответ

1

Я обнаружил, что если я делаю класс, который расширяет тему и использовать ее внутри функции addShutdownHook, что она работает без проблем.

public class ShutdownHandler extends Thread { 
     public void run(){ 
      // do all the work to clean up before shutting down 
     } 
} 

, а затем просто добавить его в главном классе

Runtime.getRuntime().addShutdownHook(new ShutdownHandler()); 

EDIT

После прочтения немного больше о ExecutorService, это может быть, что это, получающего shutdown или shutdownNow когда приложение начинает выходить. addShutdownHook запускается, когда приложение начинает свою последовательность выключения. Таким образом, возможно, что ExecutorService выключается до того, как будет запущен ваш крючок завершения.

Смежные вопросы