有个如下类似的应用,使用Runtime call一个命令行来启动一个Apache服务器,在“确定服务器启动后”打开一个TestPage.html测试。
问题就是Runtime调用命令默认情况下很快就返回了,接下来打开的测试页面就会提示连接不到服务器。要保证打开浏览器的时候服务器已经正确能用了。
Process process = Runtime.getRuntime().exec(shell);
代码能够返回一个Process,有个方法waitFor()可以阻塞并等待Process返回。其DOC如下:
causes the current thread to wait, if necessary, until the process represented by this Process object has terminated.
但是这个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;
}
-----
其他方法?
分享到:
相关推荐
JRE 1.4.2 JRE(Java Runtime Environment,Java运行环境),运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库。
JRE(Java Runtime Environment)——windows Java运行环境 64bit
Java Runtime Environment-6.0.26.exe
JRE1.8.0(Java Runtime Environment)——Java运行环境32bit
Java Runtime Environment 1.6.0.7 (32-bit
java runtime environment 1.8.0_45 64bit.rar
Java Runtime For MacOS X 10.7
java runtime environment 1.8.0_45 64bit jre1.8.0_45 64bit jre-8u261
毕业时的外文翻译原文 A Race-Aware Java Runtime
jre(Java Runtime Environment),Java运行环境64位安装包
jre(Java Runtime Environment),Java运行环境32位安装包
Installation notes for the J2SE Runtime Environment 5.0 (JRE), including system requirements and installation instructions, are available for the following platforms. Platform 32-bit Installation 64...
java runtime environment(JRE)安装 2020-11-4 一、搭建环境 1.1 安装Keil 5 官网下载:http://www2.keil.com/mdk5/ 百度网盘:https://pan.baidu.com/s/18t_ta0WWX_f1KCKXfgj_Zw 提取码:gx3r 1.2 安装JRE 由于...
Java Runtime Environment-6.0.450
Java SE程序 Runtime类Java SE程序 Runtime类Java SE程序 Runtime类Java SE程序 Runtime类Java SE程序 Runtime类Java SE程序 Runtime类Java SE程序 Runtime类Java SE程序 Runtime类Java SE程序 Runtime类Java SE程序...
java 环境
NULL 博文链接:https://dingherry.iteye.com/blog/1545972
Java Runtime Environment,Java运行环境64位安装包,官网下载。 Java SE Runtime Environment 8 Downloads Do you want to run Java™ programs, or do you want to develop Java programs? If you want to run ...
ArcGIS Runtime SDK for Java 100.12.0 的...如需在生产环境中使用ArcGIS Runtime SDK for Java,请联系ESRI公司获得授权,现在也有国产替代产品GeoScne Runtime SDK for Java,可以联系易智瑞公司获得相关资源和授权。
Java SE Runtime Environment(运行时环境)包含了运行以 Java 编程语言编写的程序所必需的 Java 虚拟机、运行时类库和 Java 应用程序启动器。 Java 平台的安全性 一个由角色提供的安全信息的描述。适用于开发人员...