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方法
贊.
---------------------
自己實際測試了一下,地址如下.