В моем коде я использую 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);
}
}
});
}
}
Как вы думаете, что это разумное решение, или это небезопасно для регистрации и отмены регистрации выключения крюка с использованием локальных классов?
Заранее спасибо
С уважением