通过Runtime.getRuntime().addShutdownHook(Thread hook)
方法可以给当前的进程注册一个清理线程,当进程退出的时候,会执行线程中的代码。
1、为了统一清理线程的实现,可以做一个Destroyable接口,实现此接口的类都有一个destroy()方法,里面包含了该类的清理过程,例如关闭数据库连接、关闭Socket连接等。
Destroyable接口的代码:
package net.blogjava.amplifier;
/**
* 建立此接口的目的是为了实现程序退出时的清理
* 在Java控制台程序中,用户可以通过关闭命令行窗口或按下Ctrl+C来结束程序的运行
* 这时候应该保证资源能够被正确释放,例如数据库的连接、Socket的连接应该关闭
* 实现了本接口的类的实例引用可以由一个ShutdownHook线程来操作
* 此线程在虚拟机退出时执行,详见Runtime.addShutdownHook()方法
* @author amplifier
*
*/
public interface Destroyable {
/**
* 实现本接口的类需要实现此方法,方法中包含该类的清理代码,
* 例如关闭数据库连接、关闭Socket连接等
*
*/
void destroy();
}
2、建立一个继承于Thread的类ShutdownHook,里面的一个域是Destroyable实现类的引用,在该类的构造函数中可以传入该Destroyable实现类。
ShutdownHook的代码:
package net.blogjava.amplifier;
public class ShutdownHook extends Thread {
private Destroyable desObj;
public ShutdownHook(Destroyable desObj){
this.desObj = desObj;
}
@Override
public void run() {
if(this.desObj!=null){
try{
this.desObj.destroy();
}
catch (Exception e) {
}
}
}
/** *//**
* @param args
*/
public static void main(String[] args) {
}
}
3、在main()方法中注册ShutdownHook。
public static void main(String[] args){
DestroyableImpl di = new DestroyableImpl();
ShutdownHook sh = new ShutdownHook(di);
Runtime.getRuntime().addShutdownHook(sh);
Runtime.getRuntime().addShutdownHook(new Thread(){
public void run(){
System.out.println("正在退出……");
}
});
di.otherMethod();
}
相关推荐
一般不能实例化一个 Runtime 对象,应用程序也不能创建自己的 Runtime 类实例,但可以通过 getRuntime 方法获取当前 Runtime 运行时对象的引用。 一旦得到了一个当前的 Runtime 对象的引用,就可以调用 Runtime ...
ShutdownHook 的实现代码非常简单,只需要使用 Runtime.getRuntime().addShutdownHook(Thread) 方法,并传入一个线程对象,该线程对象将会在 JVM 关闭时被执行。在这个线程对象中,我们可以执行清理操作,例如保存...
在Java编程中,`Runtime`类的`shutdownHook`是一个重要的特性,它允许开发者在Java虚拟机(JVM)即将关闭时执行清理任务。本文将深入解析`shutdown hook`的使用,以及它在不同场景下的应用。 首先,`shutdown hook`...
你可以通过`Runtime.getRuntime().addShutdownHook(Thread hook)`注册自定义的`Thread`,在程序退出前进行必要的清理工作,如关闭文件流、释放网络连接等。 此外,Java还提供了`Thread.stop()`和`Thread.interrupt...
Runtime.getRuntime().addShutdownHook(new Thread() { @Override public void run() { try { server.stop(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } }); } Or ...
`Runtime`类是单例的,意味着每个Java应用都有一个与之关联的`Runtime`实例,可以通过`Runtime.getRuntime()`获取。 `Runtime`类的主要功能包括: 1. **进程管理**: - `exec(String command)`: 这个方法用于启动...
15. **关闭钩子(Shutdown Hook)**:通过`Runtime.getRuntime().addShutdownHook(Thread hook)`注册自定义的关闭钩子,这些钩子在JVM关闭时执行,用于清理资源。 16. **精灵线程(Daemon Thread)**:精灵线程是不...
Runtime类的实例是全局的,每个Java应用程序都只有一个Runtime实例,通过`Runtime.getRuntime()`静态方法可以获取到这个实例。 一、Runtime类的内存管理 1. `totalMemory()`: 这个方法返回Java虚拟机当前分配的总...
SpringBoot Rest与以下库中的JVM Futures结合 ... Runtime.getRuntime().addShutdownHook(new Thread(SpringBootFuturesSimulation::shutdown)); new SpringApplicationBuilder(SpringWebFuturesAppl
在Java编程中,"关闭钩子"是一种重要的机制,它允许开发者在应用程序退出或中断时执行必要的清理任务。关闭钩子,也称为Shutdown Hooks,确保即使在非正常退出的情况下,特定的代码块仍能得到执行。本文将深入探讨...
Runtime.getRuntime().addShutdownHook(new Thread(() -> { try { watchService.close(); } catch (Exception e) { } })); } } ``` 上述代码首先定义了一个名为TestWatchService的类和main方法。在main方法...
可以使用`Runtime.getRuntime().addShutdownHook(Thread hook)`来添加一个钩子。 5. **Spring Boot应用关闭**: - 如果"shutdown-app"是在Spring Boot环境下,那么可能涉及到`@PreDestroy`注解,它标记在方法上,...
Runtime.getRuntime().addShutdownHook(new Thread() { @Override public void run() { graphDb.shutdown(); } }); } public static void main(String[] args) throws IOException { // 清除旧数据库 ...