`
liusu
  • 浏览: 171368 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Java Runtime Process状态判断

阅读更多
有个如下类似的应用,使用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中,可以通过`java.io.File`类提供的方法来判断文件的某些属性,例如判断文件是否为隐藏文件或只读文件。具体的方法包括: 1. **判断文件是否隐藏**:使用`File.isHidden()`方法。需要注意的是,此方法并非...

    在Linux系统下用java执行系统命令实例讲解

    退出状态码通常用于判断命令是否成功执行。 五、异常处理 在执行命令时,可能会遇到找不到命令、权限不足等问题,因此需要捕获并处理`IOException`和`InterruptedException`。 ```java try { // 执行命令代码... ...

    基于Java判断网络是否正常代码实例

    在Java中,判断网络是否正常可以使用Runtime.getRuntime().exec()方法来调用系统外部的ping命令,通过执行ping命令来判断网络是否正常。这种方法可以通过执行ping命令来获取网络的状态,如果网络畅通,则返回true,...

    Java简单实现Ping功能.doc

    执行命令后,可以通过`process.getInputStream()`和`getErrorStream()`获取标准输出和错误输出,解析输出结果以判断ping操作是否成功。 ### 2. 使用Mina库实现ping功能 Apache Mina是一个网络通信框架,它提供了一...

    可以在应用程序中启动、关闭其他的应用程序、判断是否

    在Java中,我们可以使用`Runtime.getRuntime().exec()`方法来执行外部命令;在C#中,`System.Diagnostics.Process.Start()`方法可以用来启动新的进程;而在Python中,我们可以使用`os.system()`或`subprocess`模块来...

    Windows下 tomcat的守护进程、心跳程序

    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 " + ...

    Android 判断是否有外网连接

    Process p = Runtime.getRuntime().exec("ping -c 3 -w 100 " + ip); // ping三次,等待100毫秒 // 可选:读取ping的结果 InputStream input = p.getInputStream(); BufferedReader in = new BufferedReader...

    Android中判断网络连接状态的方法

    在Android开发中,判断设备的网络连接状态是一项基础且重要的任务。这有助于确保应用能够正确地响应网络相关的操作,如数据同步、更新或者下载等。以下是一些在Android中检查网络连接状态的方法: 1. **使用...

    一个简单的调用sql loader批量数据导入程序

    `Runtime.getRuntime().exec()`方法用于执行命令,`waitFor()`方法等待命令执行完成并返回退出状态码,根据退出状态码判断导入是否成功。 在提供的`Frame1.java`和`Application1.java`文件中,可能包含了创建图形...

    Android检查网络连接

    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 ...

    Androiod代码实现实时监控Cpu利用率、Memory利用率完整代码实现

    Process process = Runtime.getRuntime().exec("dumpsys cpuinfo"); BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); String line; double user = 0, system = ...

    shell JSP的

    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 判断是否能真正上网的实例详解

    总结起来,Android应用程序判断是否能真正上网,既可以通过`ConnectivityManager`检查网络连接状态,也可以结合ping命令进行网络连通性验证。同时,开发者还应考虑到不同的网络环境(如Wi-Fi、移动数据)以及可能的...

    ping 实现ping 实现

    Process process = Runtime.getRuntime().exec(command); BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream())); String line = null; int count = 10, index; // 只解析...

    android实时网络质量检测

    Process process = Runtime.getRuntime().exec("ping -c 4 " + host); // -c 4 表示发送4个ping包 BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); ...

    在android 中调用ping命令 来获取网络通断

    Process p = Runtime.getRuntime().exec("ping -c1 -w100 " + ipAddress); int status = p.waitFor(); if (status == 0) { return true; // 网络通畅 } else { mPingIpAddrResult = "Fail: IP addr not ...

    android静默安装小demo

    在执行命令时,可以读取其`Process`对象的输入流和错误流,分析返回信息来判断安装结果。 5. **卸载应用**:类似地,静默卸载可以使用`adb uninstall package-name`命令,同样需要root权限。在执行命令后,同样需要...

    Android 的cpu 硬盘 内存 网络设置 系统信息 硬件信息.pdf

    process = Runtime.getRuntime().exec("cat /proc/cpuinfo"); dataInputStream = new DataInputStream(process.getInputStream()); bufferedReader = new BufferedReader(new InputStreamReader(dataInputStream)...

    jBPM5_用户手册-中文版

    jbPM5是基于Java技术,遵循Business Process Execution Language (BPEL) 和Java Persistence API (JPA) 规范,旨在帮助开发者和业务分析师实现灵活且可扩展的业务流程自动化。本用户手册将详细介绍如何使用jbPM5进行...

Global site tag (gtag.js) - Google Analytics