`
liusu
  • 浏览: 170109 次
  • 性别: 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;
						}



-----

其他方法?
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics