Java在方法内部添加关闭挂钩



在我的代码中,我使用CompletionService和ExecutorService来启动一堆线程来执行一些任务(这可能需要很多时间)。因此,我有一个方法,它创建ExecutorService和CompletionService,然后开始提交线程,然后获取结果。我想添加一个关闭挂钩,以便优雅地关闭执行器(我知道我可能应该处理释放资源而不是关闭执行器,但在我的情况下,每个线程都有自己的资源,所以优雅地关闭它们可能是一个很好的解决方案)。

为此,我编写了以下代码

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

您认为这是一个合理的解决方案,还是使用本地类注册和注销关闭挂钩不安全?

提前感谢

问候

来自API停堆钩的设计:

简单的关闭挂钩通常可以写成匿名的内部类,如本例所示:

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

这个习惯用法很好,只要你永远不需要取消钩子,在这种情况下,你需要在创建钩子时保存对它的引用

相关内容

  • 没有找到相关文章

最新更新