我能想到是:重新启动A
A启动B,A退出
B启动A,B退出,这样就完成了A的重新启动,请问大家有比这个简洁的方法吗?
A启动B,A退出
B启动A,B退出,这样就完成了A的重新启动,请问大家有比这个简洁的方法吗?
解决方案 »
- 又是HELLO WORLD 大家帮我看看
- 如果输入的日期大于12月8日,则执行{...}语句,用java SE怎么表达
- 谁来解释,基本类型与对象参数传递问题?
- 求 org.apache.commons.net.ftp.FTPClient 设置主动传输模式完整代码
- 菜鸟问个小问题
- 如何从socket读入一个float型数据?(请进)在线等待
- 各位大虾,请教一段java源码,初学还不懂,急!!!
- 高手救命 在线急等!
- jdbc连接MySQL数据库问题,高分。
- 有个问题一直想不明白,是关于类的,很简单的
- 请教一个题目,java io中的,并且将一首诗排序
- 求问高人google的自动纠错功能是怎么做的?
public static void main(String[] args) {
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
Runtime.getRuntime().exec("java xxx");
}
});
System.exit(0);
}
}
不过象这个例子可能会不断的重复启动,所以可以再启动时加个参数来判断是否调用addShutdownHook
端口占用方式:主程序启动一个serverSocket,监控线程定期连这个端口,如果能连,说明是正常的,否则重庆。
如果是这样的话,你可能需要建立一个监控线程,如果你这个服务没有运行的话,就重启再次运行它。org.apache.commons.io.ThreadMonitor有一个这样的监控线程,可以试一试。当然,还有一种方式就是我们的服务运行期间都会写日志,一旦我们的日志不再更新了的话,我们可以重启我们的服务,jdk7中提供有对文件或者目录监控的类,可以参考的。
有很多辅助手段来处理这个事情,最好的还是找到事情出现在哪里,然后解决,同时,最好的利用服务相关的业务去控制这个事情。
一看你就是没好好看我的回复,我说了可以带参数(当然也可以启动的时候设置属性)
比如
if (xxx) { //判断条件再调用addShutdownHook,如果是GUI程序,做在某个"再启动"按钮事件就好了
Runtime.getRuntime().addShutdownHook(xxx);
}
呵呵,你这个参数怎么加,难道你启动的时候能知道退出时是正常还是异常退出的吗。如果是要能在异常退出之后还能重启,这样是行不通的,因为异常退出你的hook线程执行不到;如果要正常退出,结果又给你重启了,好玩
是否重启,判断应该在hook线程里,而不是判断加不加hook线程,在hook线程里判断是否当前执行的为重启动作
我想试问你,你的hook线程又是如何判断正常启动和非正常启动?所以我说了,如果是GUI程序做在按钮事件是最好的,让用户选择。
好吧我不知道,呵呵这都不知道 我混个dan
你启动的时候怎么知道是要正常退出,难道你还没出生就知道自己的名字没法交流呵呵 别瞎掰了
我觉得你就是混个dan,不知道还不谦虚学习,你要是知道又怎么会问出这么无知的问题。
如果你有好方案你大可以说出来,互相讨论,不要别人提出来了,你就瞎唧唧歪歪,你清楚LZ的需求吗?如果LZ只是想知道怎么让程序重启,这未免也不是一个思路。和你不只没法交流,还觉得你很无知,甚至无理取闹,属于没事找事。
首先我说的是一种思路,我的例子也只是一个例子,而且例子中的问题我也说了,让LZ自己根据实际情况来判断处理,在不知道LZ的程序是什么的前提下,我能说的也只有这么多。
如果LZ的程序是一个服务,那么你说的问题就很好解决,服务都是用socket监听端口,就好像Tomcat启动和关闭一样,这样就可以在服务中监听,如果收到某个重启的指令,那就追加hook,然后退出程序。如果是GUI程序,那就更简单,做在按钮事件里就好了。如果还有什么其他不足,大可由LZ提出问题,还轮不到在这里瞎搅和,不懂装懂。你又不是LZ,你清楚LZ的业务吗?你有见过程序重启是无限重启的吗?都是程序提示用户是否重启或者程序做了某些update需要重启,这些都是触发重启的事件,都是有条件可判断的。你怎么就没想到这些呢?
如果你吃饱了没事干,就自己面壁去,别来污染这里的环境,这里没人有空陪你瞎掰。
你好,谢谢你的讲解可我还是不懂啊,还没用过Runtime,我要做一个看门狗似的东西来实时向系统后台发送心跳包,如果一定时间内收不到回应,则视为系统异常,重启系统,然后再这样循环,很简单的东西,卡在这了,那个参数怎么写啊??是C/S的程序
那就很简单了。你的后台程序接收心跳包,如果超过了一定时间没收到,就追加hook,直接调用Runtime.getRuntime().exec("java your_class"); 也不需要特意追加启动参数了,因为你这相当于触发事件才调用的,所以不会发生无限重启。
你去看下java命令的一些选项和参数 你确定你的classpath对么 确定你的类名对么
比如你要编译一个类Test,命令是
javac Test.java
你要启动执行Test,命令就是
java Test所以这里你要写的是启动程序的命令,即 java Test 这里的Test就是你的类的名字,也就是说exec里的参数就是你要调用的命令的字符串,(这里要注意,这个简单的命令是在你设置好classpath参数的前提下调用的,否则可以使用 java -classpath your_classpath Test),如果程序启动比较复杂,可以写个批处理命令,exec的参数直接写这个批处理命令