java-Runtime钩子回调

jopen 10年前

原文  http://wangxinchun.iteye.com/blog/2190844


jvm退出的时候,会通过回调钩子,做退出前的资源清理。

比如 ExecutorService的shutdown 方法,在关闭tomcat或者jvm退出时调用,能保证已经提交的任务得以执行,如果不调用,那么可能直接退出,导致已经提交的任务也无法执行。

下面这个case说明了钩子使用的场景

public class TaskUtil {    private static Logger logger = LoggerFactory.getLogger(TaskUtil.class.getName());    private static ScheduledExecutorService service = Executors.newScheduledThreadPool(8);    private static void close() {      try {        service.shutdown();      } catch (Exception e) {        try {          service.shutdownNow();        } catch (Exception e1) {          logger.error(e1.getMessage(), e1);        }      }    }    public static void registerTask(BaseTask task,long delay,TimeUnit unit){      service.schedule(task, delay, unit);      logger.info("注册任务:{} 成功", new Object[] {task.getMyTaskName()});    }     static {       Runtime.getRuntime().addShutdownHook(new Thread() {         public void run() {          close();         }       });     }  }