有一个一直需要运行的后台程序。
就是在系统初始化后一直运行,程序运行在solaries上,在程序启动时,
会通过Runtime.getRuntime().addShutdownHook增加一个在程序终止的时候会调用的代码。
在solaries上通过kill 进程号后次Thread中的类是可以正常调用的。但是在eclipse中编译测试的时候这个方法却无法被执行。我是直接点击红色的按钮关闭的。
如何才能实现这个方法

解决方案 »

  1.   

    public class ConquerFinder  {

    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);
    光点了叉,后台仍然在运行,不算真正的退出
      

  2.   

    可能我描述的不清楚  这个程序是一只运行的,通过监听socket端口和接收jms来执行相应逻辑,在正常情况下是不会停止的。
    我现在需要做的是在程序停止的时候(手动kill 进程号),比如在升级程序的时候需要将老的版本停止,但是内存中的对象是不能丢失的。
    需要将内存中的东西序列化到文件中。在程序再次启动时,再读回来。
    这个步骤在solaries上测试是没有问题的,在kill后挂钩中的程序被成功调用。但是在开发阶段 我需要在eclipse中调试,在程序运行的过程中需要手动让他停止(时间是不确定的),然后调用挂钩中的代码。
    当直接点击eclipse中红色的按钮 挂钩是不会调用的。
    程序中不会存在system.exit的代码。
      

  3.   

    你可以在你需要调试的时候增加System.exit的代码,不能通过Terminate按钮
    或者不通过eclipse,直接运行、kill、打印addShutdownHook中信息的方式来调试
      

  4.   

    直接运行、kill、打印addShutdownHook中信息的方式来调试
    这招我已经试过了,只要在eclipse内部执行的好像都不可以,不管是直接kill得,还是用dos命令kill得
    还是用System.exit(0)来测试把。然后测完了删掉
      

  5.   

    System.exit(0); 没错。kill用法有点不同。
      

  6.   

    eclipse里面就用exit
    不用eclipse,自己可以写sh或是bat脚本来运行