ShutdownHookManager順序並有優先級的Hook


RM源碼中實現了一個有序並有優先級的Hook,ShutdownHookManager相比JVM本身的執行Hook方式具有如下兩種特性(默認JVM執行,無序,並發)

1.順序

2.有優先級

++++++++

類被初始化時候執行

1.設置shutdownInProgress標示

2.執行Hook按照調度優先級

private AtomicBoolean shutdownInProgress = new AtomicBoolean(false);

static {
  Runtime.getRuntime().addShutdownHook(  //添加了一個Hook,標示關閉正在執行。開始執行Hook,Hook執行順序根據調度優先級
    new Thread() {
      @Override
      public void run() {
       MGR.shutdownInProgress.set(true);
        for (Runnable hook: MGR.getShutdownHooksInOrder()) {
          try {
           hook.run();  //注意調用的run方法,不是start方法,hook為順序執行
          } catch (Throwable ex) {
            LOG.warn("ShutdownHook '" + hook.getClass().getSimpleName() +
                     "' failed, " + ex.toString(), ex);
          }
        }
      }
    }
  );
}

Set集合本身是沒有順序的,轉換List,Collecitons.sort排序,並實現comparator,重新放到List

private Set<HookEntry> hooks =
  Collections.synchronizedSet(new HashSet<HookEntry>());

/**
* Returns the list of shutdownHooks in order of execution,
* Highest priority first.
*
* @return the list of shutdownHooks in order of execution.
*/
List<Runnable> getShutdownHooksInOrder() {
  List<HookEntry> list;
  synchronized (MGR.hooks) {
    list = new ArrayList<HookEntry>(MGR.hooks);
  }
  Collections.sort(list, new Comparator<HookEntry>() {

    //reversing comparison so highest priority hooks are first
    @Override
    public int compare(HookEntry o1, HookEntry o2) {
      return o2.priority - o1.priority;
    }
  });
  List<Runnable> ordered = new ArrayList<Runnable>();
  for (HookEntry entry: list) {
    ordered.add(entry.hook);
  }
  return ordered;
}

順序,非並發執行Hook實現方式,主要邏輯。

總結:

執行單個Manager Hook,這個Manager Hook本身管理了,其他Hook,其他的Hook添加和刪除都是通過這個MHook來執行的(Manager Hook)。

當系統退出的時候,MHook獲取已根據調度優先級返回的Order Collection,順序執行其中的run方法

贊.

---------------------

自己實際測試了一下,地址如下.

github地址:https://github.com/yanbit/java_basic/blob/master/src/com/yanbit/source/study/ShutdownHookManager.java


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM