有一个一直需要运行的后台程序。
就是在系统初始化后一直运行,程序运行在solaries上,在程序启动时,
会通过Runtime.getRuntime().addShutdownHook增加一个在程序终止的时候会调用的代码。
在solaries上通过kill 进程号后次Thread中的类是可以正常调用的。但是在eclipse中编译测试的时候这个方法却无法被执行。我是直接点击红色的按钮关闭的。
如何才能实现这个方法
就是在系统初始化后一直运行,程序运行在solaries上,在程序启动时,
会通过Runtime.getRuntime().addShutdownHook增加一个在程序终止的时候会调用的代码。
在solaries上通过kill 进程号后次Thread中的类是可以正常调用的。但是在eclipse中编译测试的时候这个方法却无法被执行。我是直接点击红色的按钮关闭的。
如何才能实现这个方法
public static void main(String args[]) throws Exception {
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
System.out.println("End");
}
});
int i = 1;
while(true) {
i++;
if (i == 100) {
System.exit(0);
}
}
}
}用线程类或者Runnable实现run方法
必须要注意的是如果没有退出,则不会执行句柄
比如,把System.exit(0);给祝掉,就不会执行
如果用的是JFrame
没有设置
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
光点了叉,后台仍然在运行,不算真正的退出
我现在需要做的是在程序停止的时候(手动kill 进程号),比如在升级程序的时候需要将老的版本停止,但是内存中的对象是不能丢失的。
需要将内存中的东西序列化到文件中。在程序再次启动时,再读回来。
这个步骤在solaries上测试是没有问题的,在kill后挂钩中的程序被成功调用。但是在开发阶段 我需要在eclipse中调试,在程序运行的过程中需要手动让他停止(时间是不确定的),然后调用挂钩中的代码。
当直接点击eclipse中红色的按钮 挂钩是不会调用的。
程序中不会存在system.exit的代码。
或者不通过eclipse,直接运行、kill、打印addShutdownHook中信息的方式来调试
这招我已经试过了,只要在eclipse内部执行的好像都不可以,不管是直接kill得,还是用dos命令kill得
还是用System.exit(0)来测试把。然后测完了删掉
不用eclipse,自己可以写sh或是bat脚本来运行