我能想到是:重新启动A
A启动B,A退出
B启动A,B退出,这样就完成了A的重新启动,请问大家有比这个简洁的方法吗?

解决方案 »

  1.   

    用Runtime的addShutdownHook(Thread hook)方法试试看class Test {
        public static void main(String[] args) {
            Runtime.getRuntime().addShutdownHook(new Thread() {
                public void run() {
                    Runtime.getRuntime().exec("java xxx");
                }    
            });
            System.exit(0);
        }
    }
    不过象这个例子可能会不断的重复启动,所以可以再启动时加个参数来判断是否调用addShutdownHook
      

  2.   

    监控线程+文件锁(或端口占用)文件锁方式:主程序启动时,打开一个锁文件流,监控线程定时删除锁文件,如果能删掉说明主进程不见了,启动它,否则是正常的
    端口占用方式:主程序启动一个serverSocket,监控线程定期连这个端口,如果能连,说明是正常的,否则重庆。
      

  3.   

    不知道你这样做的用意是什么,按照我的理解你应该是不知道什么原因导致服务退出了,但是你要服务一直处于运行状态。
    如果是这样的话,你可能需要建立一个监控线程,如果你这个服务没有运行的话,就重启再次运行它。org.apache.commons.io.ThreadMonitor有一个这样的监控线程,可以试一试。当然,还有一种方式就是我们的服务运行期间都会写日志,一旦我们的日志不再更新了的话,我们可以重启我们的服务,jdk7中提供有对文件或者目录监控的类,可以参考的。
    有很多辅助手段来处理这个事情,最好的还是找到事情出现在哪里,然后解决,同时,最好的利用服务相关的业务去控制这个事情。
      

  4.   


    一看你就是没好好看我的回复,我说了可以带参数(当然也可以启动的时候设置属性)
    比如
    if (xxx) { //判断条件再调用addShutdownHook,如果是GUI程序,做在某个"再启动"按钮事件就好了
        Runtime.getRuntime().addShutdownHook(xxx);
    }
      

  5.   


     呵呵,你这个参数怎么加,难道你启动的时候能知道退出时是正常还是异常退出的吗。如果是要能在异常退出之后还能重启,这样是行不通的,因为异常退出你的hook线程执行不到;如果要正常退出,结果又给你重启了,好玩
      

  6.   


    是否重启,判断应该在hook线程里,而不是判断加不加hook线程,在hook线程里判断是否当前执行的为重启动作
      

  7.   

    哎,没法交流,java怎么加启动参数都不知道,一种是main方法的参数,一种是java -D设置属性启动
    我想试问你,你的hook线程又是如何判断正常启动和非正常启动?所以我说了,如果是GUI程序做在按钮事件是最好的,让用户选择。
      

  8.   


    好吧我不知道,呵呵这都不知道 我混个dan
    你启动的时候怎么知道是要正常退出,难道你还没出生就知道自己的名字没法交流呵呵 别瞎掰了 
      

  9.   


    我觉得你就是混个dan,不知道还不谦虚学习,你要是知道又怎么会问出这么无知的问题。
    如果你有好方案你大可以说出来,互相讨论,不要别人提出来了,你就瞎唧唧歪歪,你清楚LZ的需求吗?如果LZ只是想知道怎么让程序重启,这未免也不是一个思路。和你不只没法交流,还觉得你很无知,甚至无理取闹,属于没事找事。
    首先我说的是一种思路,我的例子也只是一个例子,而且例子中的问题我也说了,让LZ自己根据实际情况来判断处理,在不知道LZ的程序是什么的前提下,我能说的也只有这么多。
    如果LZ的程序是一个服务,那么你说的问题就很好解决,服务都是用socket监听端口,就好像Tomcat启动和关闭一样,这样就可以在服务中监听,如果收到某个重启的指令,那就追加hook,然后退出程序。如果是GUI程序,那就更简单,做在按钮事件里就好了。如果还有什么其他不足,大可由LZ提出问题,还轮不到在这里瞎搅和,不懂装懂。你又不是LZ,你清楚LZ的业务吗?你有见过程序重启是无限重启的吗?都是程序提示用户是否重启或者程序做了某些update需要重启,这些都是触发重启的事件,都是有条件可判断的。你怎么就没想到这些呢?
    如果你吃饱了没事干,就自己面壁去,别来污染这里的环境,这里没人有空陪你瞎掰。
      

  10.   


    你好,谢谢你的讲解可我还是不懂啊,还没用过Runtime,我要做一个看门狗似的东西来实时向系统后台发送心跳包,如果一定时间内收不到回应,则视为系统异常,重启系统,然后再这样循环,很简单的东西,卡在这了,那个参数怎么写啊??是C/S的程序
      

  11.   

    LZ可以去看看Runtime的API和java命令的一些选项qybao提供的方式就可以了 在重启的时候可以通过在java命令后面跟几个参数(在Runtime.getRuntime().exec("java xxxx arg1 arg2 arg3 arg4");) 动态编辑这些参数用来继承上次程序运行的状态Java Main函数基础教程
      

  12.   

    在Runtime.getRuntime().exec(这里写.class文件的路径吗?不行啊)
      

  13.   


    那就很简单了。你的后台程序接收心跳包,如果超过了一定时间没收到,就追加hook,直接调用Runtime.getRuntime().exec("java your_class"); 也不需要特意追加启动参数了,因为你这相当于触发事件才调用的,所以不会发生无限重启。
      

  14.   


    你去看下java命令的一些选项和参数 你确定你的classpath对么 确定你的类名对么
      

  15.   

    写你要调用的java命令
    比如你要编译一个类Test,命令是
    javac Test.java
    你要启动执行Test,命令就是
    java Test所以这里你要写的是启动程序的命令,即 java Test 这里的Test就是你的类的名字,也就是说exec里的参数就是你要调用的命令的字符串,(这里要注意,这个简单的命令是在你设置好classpath参数的前提下调用的,否则可以使用 java -classpath your_classpath Test),如果程序启动比较复杂,可以写个批处理命令,exec的参数直接写这个批处理命令
      

  16.   

    开个cmd,把自己kill掉,然后再把自己开起来,然后关闭cmd