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