程序结束时执行任务的常用方法
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...
给主人留下些什么吧!~~
评论热议
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...
给主人留下些什么吧!~~
评论热议
相关文章推荐
- 一种利用线程池线程执行任务, 并能够结束超时任务的方法 (.NET实现)
- 探讨Windows窗体程序执行周期性任务的几种方法
- C# TimeSpan类计算程序执行的时间及此类的其他常用方法
- python执行外部程序的常用方法小结
- Android常用异步任务执行方法
- Windows 2008 r2任务计划程序执行批处理失败问题解决方法
- 你知道的,javascript语言的执行环境是"单线程模式",这种模式的好处是实现起来比较简单,执行环境相对单纯;坏处是只要有一个任务耗时很长,后面的任务都必须排队等着,会拖延整个程序的执行,因此很多时候需要进行“异步模式”,请列举js异步编程的方法。
- 定时执行任务的三种方法
- 在程序执行耗时操作时显示动画窗口以指示任务正在进行
- Session_End()这个方法,为什么在会话结束的时候没有执行?
- 总结C#中得到程序当前工作目录和执行目录的一些方法
- 在DELPHI中调用一个可执行程序得方法
- WEB程序如何执行定时任务。(转)
- 控制一个 Java 程序运行生命周期结束前不能再次被执行
- 定时执行任务的三种方法
- 定时执行任务的三种方法
- java定时执行任务的三种方法
- 定时执行任务的三种方法
- 常用软件滤波方法及其示例程序
- 使用Swing Worker线程 --执行后台任务的新方法