Chinaunix首页 | 论坛 | 博客
  • 博客访问: 27902
  • 博文数量: 13
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 135
  • 用 户 组: 普通用户
  • 注册时间: 2016-08-17 16:06
文章分类

全部博文(13)

文章存档

2017年(5)

2016年(8)

我的朋友

分类: Java

2016-08-29 21:51:31

程序结束时执行任务,常用方式:
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
强制关闭某进程,不调用钩子直接退出。


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

上一篇:没有了

下一篇:java常用的线程池

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