有个如下类似的应用,使用Runtime call一个命令行来启动一个Apache服务器,在“确定服务器启动后”打开一个TestPage.html测试。
问题就是Runtime调用命令默认情况下很快就返回了,接下来打开的测试页面就会提示连接不到服务器。要保证打开浏览器的时候服务器已经正确能用了。
代码能够返回一个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本身提供的状态和方法。
一个比较笨的方法,代码如下:
一个接口:
-------
关键问题就是无法通过Process对象本身来决定执行状态。所以有类似的辅助判断方法:
-----
其他方法?
问题就是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;
}
-----
其他方法?