Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaAddShutdownHook内部方法_Java_Executorservice_Shutdown Hook_Completion Service - Fatal编程技术网

JavaAddShutdownHook内部方法

JavaAddShutdownHook内部方法,java,executorservice,shutdown-hook,completion-service,Java,Executorservice,Shutdown Hook,Completion Service,在我的代码中,我使用CompletionService和ExecutorService来启动一组线程来执行某些任务(这可能需要很多时间)。 所以我有一个方法,创建ExecutorService和CompletionService,然后开始提交线程,然后获取结果。 我想添加一个shutdown钩子,以便优雅地关闭executor(我知道我可能应该处理释放资源而不是executor shutdown,但在我的情况下,每个线程都有自己的资源,所以优雅地关闭它们可能是一个很好的解决方案) 出于这个原因,

在我的代码中,我使用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(); }
});
只要您不需要取消钩子,这个习惯用法就可以了,在这种情况下,您需要在创建钩子时保存对钩子的引用