Java Runtime Process状态判断

有个如下类似的应用,使用Runtime call一个命令行来启动一个Apache服务器,在“确定服务器启动后”打开一个TestPage.html测试。

问题就是Runtime调用命令默认情况下很快就返回了,接下来打开的测试页面就会提示连接不到服务器。要保证打开浏览器的时候服务器已经正确能用了。

Process process = Runtime.getRuntime().exec(shell);


代码能够返回一个Process,有个方法waitFor()可以阻塞并等待Process返回。其DOC如下:
[i]causes the current thread to wait, if necessary, until the process represented by this Process object has terminated.[/i]

但是这个waitFor()方法在我的应用里面会导致永远阻塞,因为Process是为了启动一个Server,一当启动,这个Server就一直Running了,而Process就的waitFor()就只能一直阻塞了。

所以必须有另外的方法来判断,而不能仅依靠Process本身提供的状态和方法。

一个比较笨的方法,代码如下:

package com.liusu.classloader;

import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

public class ProcessManager {

public static void main(String[] args) {
String[] shell = new String[] { "/etc/init.d/apache", "start" };
try {
Process process = Runtime.getRuntime().exec(shell);
ProcessManager manager = new ProcessManager();
manager.run(process, new IProcessStates() {

public boolean isProcessRunOk() {
try {
Socket socket = new Socket("localhost", 80);
if (socket.isConnected()) {
socket.close();
return true;
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return false;
}

});

// 完成后,打开TestPage
manager.openTestPage();
} catch (IOException e) {
e.printStackTrace();
}
}

private void openTestPage() {
// TODO ...
}

/**
* 传入之前这个process已经启动了,IProcessStates提供了方法用以判断这个Process执行是否“成功”。
* 未确认成功之前,一直轮询。
*
* @param process
* @param states
*/
private void run(final Process process, final IProcessStates states) {
while (states.isProcessRunOk()) {
try {
Thread.sleep(1000 * 1);
} catch (InterruptedException e) {

}
}
}

}



一个接口:

package com.liusu.classloader;

public interface IProcessStates {

public boolean isProcessRunOk();

}




-------

关键问题就是无法通过Process对象本身来决定执行状态。所以有类似的辅助判断方法:


try {
Socket socket = new Socket("localhost", 80);
if (socket.isConnected()) {
socket.close();
return true;
}



-----

其他方法?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值