转载

java-Runtime钩子回调

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();      }     });    } } 
正文到此结束
Loading...