2016-03-23 2 views
0

В моем коде я использую CompletionService и ExecutorService, чтобы запустить кучу Thread для выполнения некоторой задачи (что может занять много времени). У меня есть метод, который создает ExecutorService и CompletionService, а затем начинает отправлять потоки, а затем принимает результаты. Я хотел бы добавить крюк выключения, чтобы изящно завершить работу исполнителя (я знаю, что, вероятно, я должен обработать освобождение ресурсов вместо выключения исполнителя, но в моем случае каждый поток имеет свои собственные ресурсы, поэтому их изящное закрытие может быть хорошим способом Я полагаю).Java add shutdown hook внутри метод

По этой причине я пишу следующий код

public Class myClass{ 
... 
private CompletionService<ClusterJobs> completion; 
final long SHUTDOWN_TIME = TimeUnit.SECONDS.toSeconds(10); 

... 
public Message executeCommand(Message request){ 

final ExecutorService executor = Executors.newFixedThreadPool(30); 

completion = new ExecutorCompletionService<ClusterJobs>(executor); 

....//submit and take results 

Runtime.getRuntime().addShutdownHook(new Thread(){ 
      @Override 
      public void run() { 
       logger.debug("Shutting down executor"); 

       try { 
        if (!executor.awaitTermination(SHUTDOWN_TIME, TimeUnit.SECONDS)) { 
         logger.debug("Executor still not terminate after waiting time..."); 
         List<Runnable> notExecuted= executor.shutdownNow(); 
         logger.debug("List of dropped task has size " + droppedTasks.size()); 
        } 
       }catch(InterruptedException e){ 
        logger.error("",e); 
       } 
      } 
     }); 

} 
} 

Как вы думаете, что это разумное решение, или это небезопасно для регистрации и отмены регистрации выключения крюка с использованием локальных классов?

Заранее спасибо

С уважением

ответ

1

От Design of the Shutdown Hooks API:

Простые крюки выключение часто можно записать в виде анонимных внутренних классов, как в этом примере:

Runtime.getRuntime().addShutdownHook(new Thread() { 
    public void run() { database.close(); } 
}); 

Эта идиома до тех пор, пока вам не понадобится отменять крючок, и в этом случае вам нужно будет сохранить ссылку на крючок при его создании.