根据JavaAPI,所谓shutdownhook就是已经初始化但尚未开始执行的线程对象。在Runtime注册后,如果jvm要停止前,这些shutdownhook便开始执行。声明:Runtime.addShutdownHook(Thread t)
举例如下:
-
packagejohn2;
-
- /**
- *testshutdownhook
- *Allrightsreleasedandcorrectnessnotguaranteed.
- */
-
publicclassShutdownHookimplementsRunnable{
-
-
publicShutdownHook(){
-
//registerashutdownhookforthisclass.
-
//ashutdownhookisaninitialzedbutnotstartedthread,whichwillgetupandrun
-
//whentheJVMisabouttoexit.thisisusedforshortcleanuptasks.
-
Runtime.getRuntime().addShutdownHook(newThread(this));
-
System.out.println(">>>shutdownhookregistered");
- }
-
-
//thismethodwillbeexecutedofcourse,sinceit'saRunnable.
-
//tasksshouldnotbelightandshort,accessingdatabaseisalrightthough.
-
publicvoidrun(){
-
System.out.println("/n>>>Abouttoexecute:"+ShutdownHook.class.getName()+".run()tocleanupbeforeJVMexits.");
-
this.cleanUp();
-
System.out.println(">>>Finishedexecution:"+ShutdownHook.class.getName()+".run()");
- }
-
-
//(-:averysimpletasktoexecute
-
privatevoidcleanUp(){
-
for(inti=0;i<7;i++){
-
System.out.println(i);
- }
- }
-
-
/**
- *there'recoupleofcasesthatJVMwillexit,accordingtotheJavaapidoc.
- *typically:
- *1.methodcalled:System.exit(int)
- *2.ctrl-Cpressedontheconsole.
- *3.thelastnon-daemonthreadexits.
- *4.userlogofforsystemshutdown.
- *@paramargs
- */
-
publicstaticvoidmain(String[]args){
-
-
newShutdownHook();
-
-
System.out.println(">>>Sleepingfor5seconds,tryctrl-Cnowifyoulike.");
-
-
try{
-
Thread.sleep(5000);//(-:giveuthetimetotryctrl-C
- }catch(InterruptedExceptionie){
- ie.printStackTrace();
- }
-
-
System.out.println(">>>Sleptfor10secondsandthemainthreadexited.");
- }
-
- }
-
参考资料:
1.JavaAPIDocumentation
2.http://java.sun.com/j2se/1.3/docs/guide/lang/hook-design.html
也许有人会担心性能问题,shutdown hook会不会占用太多的VM的资源,答案是shutdown hook不会占用VM太多的资源,因为shutdown hook 只是一个已初始化但尚未启动的线程。这意味着它只在程序关闭的时候才会启动,而不是在程序一开始运行时就启动。而在大多数的Java平台中,如果一个线程没有启动(即没有调用线程的start()函数)VM不会分配资源给线程。因此维护一群没有启动的线程不会给VM带来太大的负担.
最后还要注意以下两点:
1.如果VM crash,那么不能保证关闭挂钩(shutdown hooks)能运行.试想一下如果Windows XP突然蓝屏了那么本来计划在关机之前的更新也就无法进行了.
2.如果调用Runtime.halt()方法来结束程序的话,那么关闭挂钩(shutdown hooks)也不会执行
分享到:
相关推荐
本篇文章是对解析Runtime中shutdown hook的使用进行了详细的分析介绍,需要的朋友参考下
JAVA虚拟机关闭钩子(Shutdown Hook).docx
在oracle数据库中,关于shutdown命令的详解。对于新手很有帮助
Shutdown用法详解及应用Shutdown使您能够一次关闭
NULL 博文链接:https://huanyue.iteye.com/blog/479413
Windows命令shutdown用法.docx
JVM问题诊断常用命令,非常非常值得收藏和深入好好学习学习
Linux系统关机命令shutdown introduction
4.CreateProcess、CreateThread、LoadImage、CmpCallback、BugCheckCallback、Shutdown、Lego等Notify Routine信息查看,并支持对这些Notify Routine的删除 5.端口信息查看,目前不支持2000系统 6.查看消息钩子 7....
部分手机在fastboot模式下在win10(8代CPU)上使用USB3.0接口连接会显示 press any key to shutdown解决方法: 下载修复文件到电脑,右键管理员运行后即可完美解决
SHUTDOWN-定时开机关机 SHUTDOWN-定时开机关机 SHUTDOWN-定时开机关机 SHUTDOWN-定时开机关机 SHUTDOWN-定时开机关机
ShutDown Expert ShutDown Expert ShutDown Expert
shutdown自动关机很好用
shutdown.rar
自动关机 Windows命令shutdown用法.docx
我的Consumers程序使用 KCL 方式读取并处理流中数据, RecordProcessor 实现了 IRecordProcessor接口,其中 RecordProcessor.shutdown 方法中调用 checkpoint() ,以实现程序重启时能从上次退出时的处理点开始继续...
列举讲解shutdown的具体应用 shutdown命令的相关参数
解决方法: 进入dos: 以DBA用户登录,具体命令是 sqlplus /NOLOG SQL>connect sys/change_on_install as sysdba 提示:已成功 SQL>shutdown normal 提示:数据库已经关闭 已经卸载数据库 ORACLE 例程已经关闭 ...
人小鬼大 感受Windows中Shutdown命令魅力 WINDOWS XP的关机中。Windows XP系统是通过一个名为Shutdown.exe的程序来完成关机操作的,关机的时候调用shutdown.exe。在Windows XP的运用中,如果我们能很好的利用这个...
此bat文件解决小米miui链接电脑进入fastboot模式时出现press any key to shutdown的问题,以管理员身份运行即可