Runtime.getRuntime().addShutdownHook(shutdownHook);
建议:同一个JVM最好只使用一个关闭钩子,而不是每个服务都使用一个不同的关闭钩子,使用多个关闭钩子可能会出现当前这个钩子所要依赖的服务可能已经被另外一个关闭钩子关闭了。为了避免这种情况,建议关闭操作在单个线程中串行执行,从而避免了再关闭操作之间出现竞态条件或者死锁等问题。
一般使用线程都想需要实现Runnable接口或继承Thread类,但是有时我们没必要去声明一个类来达到使用线程的目的 ,随时随地声明你的线程。code below:
public void generateThread()
{
Thread tr = new Thread()
{
public void run()
{
while(true)
{
System.out.println("afsdf");
}
}
};
tr.start();//start the thread
}
jvm钩子的使用:首先需要向jvm注册需要运行的类,必须是一个线程类,当jvm关闭时按照想虚拟机注册的顺序来调用那些已经注册的线程类,可参考javaapi
首先实现一个线程类,例子代码
package cn.com;
public class ShutDownHookTest implements Runnable {
public void run() {
System.out.println("hahah i am running");
}
}
其次想jvm注册该线程类
package cn.com;
public class ShutdownApp {
public static void main(String[] args)
{
Runtime rt = Runtime.getRuntime();
rt.addShutdownHook(new Thread(new ShutDownHookTest()));//register to the jvm
}
}
最后运行程序,会输出hahah i am running,表明钩子已生效