JavaAddShutdownHook内部方法
在我的代码中,我使用CompletionService和ExecutorService来启动一组线程来执行某些任务(这可能需要很多时间)。 所以我有一个方法,创建ExecutorService和CompletionService,然后开始提交线程,然后获取结果。 我想添加一个shutdown钩子,以便优雅地关闭executor(我知道我可能应该处理释放资源而不是executor shutdown,但在我的情况下,每个线程都有自己的资源,所以优雅地关闭它们可能是一个很好的解决方案) 出于这个原因,我编写了以下代码JavaAddShutdownHook内部方法,java,executorservice,shutdown-hook,completion-service,Java,Executorservice,Shutdown Hook,Completion Service,在我的代码中,我使用CompletionService和ExecutorService来启动一组线程来执行某些任务(这可能需要很多时间)。 所以我有一个方法,创建ExecutorService和CompletionService,然后开始提交线程,然后获取结果。 我想添加一个shutdown钩子,以便优雅地关闭executor(我知道我可能应该处理释放资源而不是executor shutdown,但在我的情况下,每个线程都有自己的资源,所以优雅地关闭它们可能是一个很好的解决方案) 出于这个原因,
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);
}
}
});
}
}
公共类myClass{
...
私人完成服务完成;
最终长时间停机时间=时间单位。秒到秒(10);
...
公共消息执行命令(消息请求){
final ExecutorService executor=Executors.newFixedThreadPool(30);
完成=新执行人完成服务(执行人);
..//提交并获取结果
Runtime.getRuntime().addShutdownHook(新线程(){
@凌驾
公开募捐{
调试(“关闭执行器”);
试一试{
如果(!执行器等待终止(关机时间,时间单位秒)){
debug(“等待时间过后,执行器仍未终止…”);
List notExecuted=executor.shutdownNow();
debug(“已删除任务的列表大小为”+droppedTasks.size());
}
}捕捉(中断异常e){
记录器错误(“,e);
}
}
});
}
}
您认为这是一个合理的解决方案,还是使用本地类注册和取消注册shutdownhook是不安全的
提前谢谢
问候来自:
简单的关闭挂钩通常可以编写为匿名内部类,如下例所示:
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() { database.close(); }
});
只要您不需要取消钩子,这个习惯用法就可以了。在这种情况下,您需要在创建钩子时保存对钩子的引用。来源:
简单的关闭挂钩通常可以编写为匿名内部类,如下例所示:
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() { database.close(); }
});
只要您不需要取消钩子,这个习惯用法就可以了,在这种情况下,您需要在创建钩子时保存对钩子的引用