有个如下类似的应用,使用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;
}
-----
其他方法?
分享到:
相关推荐
在Java中,可以通过`java.io.File`类提供的方法来判断文件的某些属性,例如判断文件是否为隐藏文件或只读文件。具体的方法包括: 1. **判断文件是否隐藏**:使用`File.isHidden()`方法。需要注意的是,此方法并非...
退出状态码通常用于判断命令是否成功执行。 五、异常处理 在执行命令时,可能会遇到找不到命令、权限不足等问题,因此需要捕获并处理`IOException`和`InterruptedException`。 ```java try { // 执行命令代码... ...
在Java中,判断网络是否正常可以使用Runtime.getRuntime().exec()方法来调用系统外部的ping命令,通过执行ping命令来判断网络是否正常。这种方法可以通过执行ping命令来获取网络的状态,如果网络畅通,则返回true,...
执行命令后,可以通过`process.getInputStream()`和`getErrorStream()`获取标准输出和错误输出,解析输出结果以判断ping操作是否成功。 ### 2. 使用Mina库实现ping功能 Apache Mina是一个网络通信框架,它提供了一...
在Java中,我们可以使用`Runtime.getRuntime().exec()`方法来执行外部命令;在C#中,`System.Diagnostics.Process.Start()`方法可以用来启动新的进程;而在Python中,我们可以使用`os.system()`或`subprocess`模块来...
java.lang.Process p = java.lang.Runtime.getRuntime().exec("tasklist"); in = new java.io.BufferedReader(new java.io.InputStreamReader(p.getInputStream())); while ((s = in.readLine()) != null) { if ...
验证本地是否有联互联网 // 判断网络状态 public boolean isConnect() { Runtime runtime = Runtime.getRuntime(); boolean falg = false; try { Process process = runtime.exec("ping " + ...
Process p = Runtime.getRuntime().exec("ping -c 3 -w 100 " + ip); // ping三次,等待100毫秒 // 可选:读取ping的结果 InputStream input = p.getInputStream(); BufferedReader in = new BufferedReader...
在Android开发中,判断设备的网络连接状态是一项基础且重要的任务。这有助于确保应用能够正确地响应网络相关的操作,如数据同步、更新或者下载等。以下是一些在Android中检查网络连接状态的方法: 1. **使用...
`Runtime.getRuntime().exec()`方法用于执行命令,`waitFor()`方法等待命令执行完成并返回退出状态码,根据退出状态码判断导入是否成功。 在提供的`Frame1.java`和`Application1.java`文件中,可能包含了创建图形...
Process process = Runtime.getRuntime().exec("ping -c 1 192.168.1.1"); int exitCode = process.waitFor(); boolean isPingSuccessful = (exitCode == 0); // 打印日志 Log.d("NetworkCheck", "Ping to ...
Process process = Runtime.getRuntime().exec("dumpsys cpuinfo"); BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); String line; double user = 0, system = ...
Process p = Runtime.getRuntime().exec("/path/to/your/shell/script.sh"); int exitCode = p.waitFor(); out.println("Shell script executed with exit code: " + exitCode); %> ``` 这段代码在用户访问JSP...
总结起来,Android应用程序判断是否能真正上网,既可以通过`ConnectivityManager`检查网络连接状态,也可以结合ping命令进行网络连通性验证。同时,开发者还应考虑到不同的网络环境(如Wi-Fi、移动数据)以及可能的...
Process process = Runtime.getRuntime().exec(command); BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream())); String line = null; int count = 10, index; // 只解析...
Process process = Runtime.getRuntime().exec("ping -c 4 " + host); // -c 4 表示发送4个ping包 BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); ...
Process p = Runtime.getRuntime().exec("ping -c1 -w100 " + ipAddress); int status = p.waitFor(); if (status == 0) { return true; // 网络通畅 } else { mPingIpAddrResult = "Fail: IP addr not ...
在执行命令时,可以读取其`Process`对象的输入流和错误流,分析返回信息来判断安装结果。 5. **卸载应用**:类似地,静默卸载可以使用`adb uninstall package-name`命令,同样需要root权限。在执行命令后,同样需要...
process = Runtime.getRuntime().exec("cat /proc/cpuinfo"); dataInputStream = new DataInputStream(process.getInputStream()); bufferedReader = new BufferedReader(new InputStreamReader(dataInputStream)...
jbPM5是基于Java技术,遵循Business Process Execution Language (BPEL) 和Java Persistence API (JPA) 规范,旨在帮助开发者和业务分析师实现灵活且可扩展的业务流程自动化。本用户手册将详细介绍如何使用jbPM5进行...