java shutdown_java.lang.Shutdown | 学步园

package java.lang;

import java.util.HashSet;

import java.util.Iterator;

/**

*

*

* 管理关闭序列

*

* comment by liqiang

*

* @author   Mark Reinhold

*

*/

class Shutdown {

//一个静态内部类,用来封装一个Thread对象,保证两个线程完全相等(通过比较

//内存地址相等,而不是通过equals方法的相等)

private static class WrappedHook {

private Thread hook;

WrappedHook(Thread t) {

hook = t;

}

public int hashCode() {

return System.identityHashCode(hook);

}

public boolean equals(Object o) {

//如果不是此类对象(不是此类对象内存地址肯定不等)直接返回false

if (!(o instanceof WrappedHook)) return false;

//比较内存地址是否相等

return (((WrappedHook)o).hook == hook);

}

}

//关闭状态

private static final int RUNNING = 0;

private static final int HOOKS = 1;

private static final int FINALIZERS = 2;

//单前的初始状态为RUNNING

private static int state = RUNNING;

//是否在退出时运行清除操作

private static boolean runFinalizersOnExit = false;

/* The set of registered, wrapped hooks, or null if there aren't any */

//关闭钩注册的地方,初始化为null表示不含有关闭钩

private static HashSet hooks = null;

//静态内部类,用来生成同步的锁

private static class Lock { };

//一个静态对象表示锁

private static Object lock = new Lock();

//是否在退出时运行清除操作的标志

static void setRunFinalizersOnExit(boolean run) {

synchronized (lock) {

runFinalizersOnExit = run;

}

}

/*

*

* 添加一个新的的关闭钩

*

*/

static void add(Thread hook) {

synchronized (lock) {

//如果当前ShutDown对象不是运行状态,抛出异常

if (state > RUNNING)

throw new IllegalStateException("Shutdown in progress");

//如果线程还Alive则抛出异常

if (hook.isAlive())

throw new IllegalArgumentException("Hook already running");

if (hooks == null) {

//hooks Set为空则创建新的hooks Set并将此线程对象封装成WrappedHook加入

hooks = new HashSet(11);

hooks.add(new WrappedHook(hook));

Terminator.setup();

} else {

//封装成WrappedHook对象

WrappedHook wh = new WrappedHook(hook);

//如果此封装对象已经存在则抛出异常

if (hooks.contains(wh))

throw new IllegalArgumentException("Hook previously registered");

//添加此封装对象

hooks.add(wh);

}

}

}

/*

*

* 删除注册过的关闭钩

*

*/

static boolean remove(Thread hook) {

synchronized (lock) {

//如果此对象不是运行状态抛出异常

if (state > RUNNING)

throw new IllegalStateException("Shutdown in progress");

if (hook == null) throw new NullPointerException();

//如果hooks为null表示没有注册过关闭钩则直接返回false

if (hooks == null) {

return false;

} else {

//从set中删除相应的WrappedHook

boolean rv = hooks.remove(new WrappedHook(hook));

//如果删除成功,且set为空,则将set清空

if (rv && hooks.isEmpty()) {

hooks = null;

//此方法现在不支持

Terminator.teardown();

}

return rv;

}

}

}

/*

*

* 运行所有注册的关闭钩

*

*/

private static void runHooks() {

if (hooks == null) return;

//启动注册的线程

for (Iterator i = hooks.iterator(); i.hasNext();) {

((WrappedHook)(i.next())).hook.start();

}

//等待每个线程死去

for (Iterator i = hooks.iterator(); i.hasNext();) {

try {

((WrappedHook)(i.next())).hook.join();

} catch (InterruptedException x) {

continue;

}

}

}

//停止

static native void halt(int status);

//运行清除操作

private static native void runAllFinalizers();

/*

* 此方法定义了关闭的序列

*/

private static void sequence() {

synchronized (lock) {

if (state != HOOKS) return;

}

//运行所有注册的hook

runHooks();

boolean rfoe;

synchronized (lock) {

//设置状态为FINALIZERS

state = FINALIZERS;

rfoe = runFinalizersOnExit;

}

//如果在虚拟机退出时进行清除操作则运行此操作

if (rfoe) runAllFinalizers();

}

/*

* 关闭虚拟机,由Runtime.exit调用

*/

static void exit(int status) {

boolean runMoreFinalizers = false;

synchronized (lock) {

//如果不是运行状态,则设置状态为退出时不做清除操作

if (status != 0) runFinalizersOnExit = false;

//根据不同状态做不同的处理

switch (state) {

case RUNNING: //设置为HOOKS状态

state = HOOKS;

break;

case HOOKS:  //不作操作

break;

case FINALIZERS: //FINALIZERS情况

if (status != 0) {

//停止

halt(status);

} else {

runMoreFinalizers = runFinalizersOnExit;

}

break;

}

}

if (runMoreFinalizers) {

//退出时需要做清除操作

runAllFinalizers();

//停止

halt(status);

}

synchronized (Shutdown.class) {

//顺序关闭

sequence();

//停止

halt(status);

}

}

static void shutdown() {

synchronized (lock) {

switch (state) {

case RUNNING: /* Initiate shutdown */

state = HOOKS;

break;

case HOOKS:  /* Stall and then return */

case FINALIZERS:

break;

}

}

synchronized (Shutdown.class) {

sequence();

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值