您的位置:首页 > 其它

程序结束时执行任务的常用方法

2017-03-17 19:52 127 查看
程序结束时执行任务,常用方式:

1. @PreDestroy / destroy-method

使用Spring注解@PreDestroy,在容器销毁该bean之前执行操作。由于是销毁之前执行,可以安全访问bean中的全部元素。

使用方式为:在类中某个方法上,打@PreDestroy注解,则Spring在销毁此bean之前会调用该方法。

以上是Spring框架下,对自动加载的bean最常用的销毁前执行方法。当然,仅限程序正常退出。

在Spring的xml文件中配置destroy-method,并在bean中实现该方法,与上结果类似。

在Spring中还有通过bean实现InitializingBean和 DisposableBean接口实现的,不常用。

2. 使用钩子函数

在jdk1.3之后,java实现了运行时的钩子函数入口。使用钩子函数是在jvm结束之前调用。可以在程序中加入Runtime.getRuntime().addShutdownHook({Thread})方法,则jvm结束时,会执行{thread}.start()。

钩子函数是除了kill -9会忽略外,程序结束都会调用的方法,包括kill, System.exit(), OutOfMemory宕机, 系统关闭等。但是也更底层,由jvm控制执行,不像上述注解。

在执行钩子函数过程中,不执行钩子的其余线程也仍然执行,直到钩子结束。所以如果想在钩子执行时仅有该逻辑执行,就应该在钩子中关闭其他线程池、消息消费者等。

同一个JVM最好只使用一个关闭钩子,以避免一个钩子需要的服务已经被另一个关闭。

钩子中的逻辑尽量简洁,比如将内存中缓存的数据持久化(写入文件等),等待下次启动加载即可。非必要的服务尽量避免在钩子中执行,以加快程序结束速度。

线程池有shutdown方法,可以在线程池退出时拒绝接受其他请求,并完成池内的任务。

附:人工结束程序的几种方式:

1. kill {pid} / Ctrl+C

向进程发送退出信号,平滑退出程序。“平滑”包括:

1) 如果在spring容器中,触发springbean的destroy-method回调方法。

2) 触发jvm的addShutdownHook。

2. 代码级别控制

开线程监听某种信号,出现就system.exit(0)。如监听某file是否存在,某端口是否有命令等。

由于使用代码控制,可以在exit之前编写关闭代码,因此也是一种平滑退出。

3. kill -9

强制关闭某进程,不调用钩子直接退出。


<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>

阅读(159) | 评论(0) | 转发(0) |

0
上一篇:没有了

下一篇:java常用的线程池

相关热门文章
Tomcat 6 配置SSI

tomcat + ssi

让Resin支持shtml(SSI)- 静...

ASP JavaScript Lessons(8-14)

JDK1.6官方下载_JDK6官方下载_...

linux dhcp peizhi roc

关于Unix文件的软链接

求教这个命令什么意思,我是新...

sed -e "/grep/d" 是什么意思...

谁能够帮我解决LINUX 2.6 10...

给主人留下些什么吧!~~

评论热议
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: