2016-03-23 3 views
0

In meinem Code verwende ich CompletionService und ExecutorService, um eine Reihe von Thread zu starten, einige Aufgaben (das kann eine Menge Zeit) zu starten. So habe ich eine Methode, die den ExecutorService und den CompletionService erstellt, dann beginnt, Thread zu senden und dann die Ergebnisse zu nehmen. Ich möchte einen Shutdown-Hook hinzufügen, um den Executor ordnungsgemäß herunterzufahren (Ich weiß, dass ich wahrscheinlich Ressourcen freigeben sollte statt Executor Shutdown, aber in meinem Fall hat jeder Thread seine eigenen Ressourcen, also kann es eine gute Lösung sein Ich nehme an).Java Add Shutdown Hook innerhalb Methode

Aus diesem Grund habe ich den folgenden Code schreiben

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); 
       } 
      } 
     }); 

} 
} 

Glauben Sie, dass dies eine vernünftige Lösung ist oder es ist nicht sicher Shutdown-Hook mit lokalen Klassen zu registrieren und deregistrieren?

Vielen Dank im Voraus

Grüße

Antwort

1

Von Design of the Shutdown Hooks API:

Einfachen Shutdown-Haken oft als anonyme innere Klassen geschrieben werden, wie in diesem Beispiel:

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

Dieses Idiom ist Gut, solange Sie den Hook nie abbrechen müssen. In diesem Fall müssen Sie einen Verweis auf den Hook speichern, wenn Sie ihn erstellen.

Verwandte Themen