Java 在方法中添加关闭钩子
Java add shutdown hook inside method
在我的代码中,我使用 CompletionService 和 ExecutorService 来启动一堆 Thread 来执行一些任务(这可能会花费很多时间)。
所以我有一个创建 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);
}
}
});
}
}
您认为这是一个合理的解决方案还是使用本地 类 注册和取消注册关闭挂钩是不安全的?
提前致谢
此致
来自Design of the Shutdown Hooks API:
简单的关闭钩子通常可以写成匿名内部类,如本例所示:
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() { database.close(); }
});
只要您永远不需要取消挂钩,这种用法就很好,在这种情况下,您需要在创建挂钩时保存对挂钩的引用。
在我的代码中,我使用 CompletionService 和 ExecutorService 来启动一堆 Thread 来执行一些任务(这可能会花费很多时间)。 所以我有一个创建 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);
}
}
});
}
}
您认为这是一个合理的解决方案还是使用本地 类 注册和取消注册关闭挂钩是不安全的?
提前致谢
此致
来自Design of the Shutdown Hooks API:
简单的关闭钩子通常可以写成匿名内部类,如本例所示:
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() { database.close(); }
});
只要您永远不需要取消挂钩,这种用法就很好,在这种情况下,您需要在创建挂钩时保存对挂钩的引用。