`

java runtime 之 ShutDownHook

    博客分类:
  • java
阅读更多

 

根据 Java API, 所谓 shutdown hook 就是已经初始化但尚未开始执行的线程对象。在

Runtime 注册后,如果 jvm 要停止前,这些 shutdown hook 便开始执行。

 

有什么用呢?就是在你的程序结束前,执行一些清理工作,尤其是没有用户界面的程序。

 

很明显,这些 shutdown hook 都是些线程对象,因此,你的清理工作要写在 run() 里。

根据 Java API,你的清理工作不能太重了,要尽快结束。但仍然可以对数据库进行操作。

 

 

package dirk.runtime;

public class ShutDownHook implements Runnable {
	 public ShutDownHook() { 
	        // register a shutdown hook for this class. 
	        // a shutdown hook is an initialzed but not started thread, which will get up and run 
	        // when the JVM is about to exit. this is used for short clean up tasks. 
	        Runtime.getRuntime().addShutdownHook(new Thread(this)); 
	        System.out.println(">>> shutdown hook registered"); 
	    } 
	     
	    // this method will be executed of course, since it's a Runnable. 
	    // tasks should not be light and short, accessing database is alright though. 
	    public void run() { 
	        System.out.println("/n>>> About to execute: "  + ShutDownHook.class.getName() +  ".run() to clean up before JVM exits."); 
	        this.cleanUp(); 
	        System.out.println(">>> Finished execution: "  + ShutDownHook.class.getName()  + ".run()"); 
	    } 
	     
	        // (-: a very simple task to execute 
	    void cleanUp() { 
	        for(int i=0; i < 7; i++  ) { 
	            System.out.println(i); 
	        } 
	    } 

	    /** 
	     * there're couple of cases that JVM will exit, according to the Java api doc. 
	     * typically: 
	     * 1. method called: System.exit(int) 
	     * 2. ctrl-C pressed on the console. 
	     * 3. the last non-daemon thread exits. 
	     * 4. user logoff or system shutdown. 
	     * @param args 
	     */ 
	    public static void main(String[] args) { 
	         
	        new ShutDownHook(); 
	         
	        System.out.println(">>> Sleeping for 5 seconds, try ctrl-C now if you like."); 
	         
	        try { 
	        	System.out.println("jvm run run run");
	            Thread.sleep(5000);     // (-: give u the time to try ctrl-C 
	            System.out.println("jvm prepare to shutDown");
	        } catch (InterruptedException ie) {  
	            ie.printStackTrace();  
	        } 
	         
	        System.out.println(">>> Slept for 10 seconds and the main thread exited."); 
	    } 
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics