vmprocess.java

来自「纯java操作系统jnode,安装简单和操作简单的个人使用的Java操作系统」· Java 代码 · 共 214 行

JAVA
214
字号
/*
 * $Id: VmProcess.java,v 1.2 2003/12/02 19:08:33 epr Exp $
 */
package org.jnode.vm;

import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * @author epr
 */
public class VmProcess extends Process {

	/** Identifier of this process */
	private final int id;
	/** Last used process identifier */
	private static int lastId = 1;
	/** Root thread group for this process */
	private final ThreadGroup threadGroup;
	/** Exit code */	
	private int exitValue;
	/** Is this process still running */
	private boolean running;
	final String mainClassName;
	final String[] args;
	private InputStream in;
	private InputStream err;
	private OutputStream out;
	private static Process rootProcess;

	/**
	 * Create a new process
	 *
	 * @param mainClassName
	 * @param args
	 * @param in
	 * @param out
	 * @param err
	 */	
	public VmProcess(String mainClassName, String[] args, InputStream in, PrintStream out, PrintStream err) {
		synchronized (getClass()) {
			this.id = lastId++;
		}
		this.running = true;
		this.threadGroup = new ThreadGroup("Process-" + id, this);
		this.mainClassName = mainClassName;
		if (args == null) {
			this.args = new String[0]; 
		} else {
			this.args = new String[args.length];
			System.arraycopy(args, 0, this.args, 0, args.length);
		}
		
		if (System.in == null) {
			Unsafe.debug("Set System.in.");
			System.in = in;
		}
		if (System.out == null) {
			Unsafe.debug("Set System.out.");
			System.out = out;
		}
		if (System.err == null) {
			Unsafe.debug("Set System.err.");
			System.err = err;
		}
		
		final Thread mainThread = new Thread(threadGroup, new ProcessRunner());
		mainThread.start();	
	}
	
	private VmProcess(ThreadGroup rootGroup) {
		synchronized (getClass()) {
			this.id = lastId++;
		}
		this.running = true;
		this.threadGroup = rootGroup;
		this.mainClassName = "system";
		this.args = new String[0];
	}
	
	/**
	 * Create and run a new process in its own classloader.
	 * @param mainClassName
	 * @param args
	 * @param envp
	 * @return The created process
	 * @throws Exception
	 */
	public static Process createProcess(String mainClassName, String[] args, String[] envp) 
	throws Exception {
		final ClassLoader cl = new VmProcessClassLoader();
		final Class processClass = cl.loadClass(VmProcess.class.getName());
		final Class[] argTypes = new Class[] { 
			String.class,
			String[].class,
			InputStream.class,
			PrintStream.class,
			PrintStream.class
		};
		final Constructor cons = processClass.getConstructor(argTypes);
		final Object[] consArgs = new Object[] {
			mainClassName, 
			args,
			System.in,
			System.out,
			System.err
		};
		final Process proc = (Process)cons.newInstance(consArgs);
		return proc;
	}
	
	public static Process getRootProcess(ThreadGroup group) {
		if (rootProcess == null) {
			rootProcess = new VmProcess(group);
		}
		return rootProcess;
	}
	
	/**
	 * @see java.lang.Process#destroy()
	 */
	public void destroy() {
		exit(1);
	}

	/**
	 * @see java.lang.Process#exitValue()
	 * @return The exit value
	 * @throws IllegalThreadStateException
	 */
	public int exitValue() throws IllegalThreadStateException {
		return exitValue;
	}

	/**
	 * @see java.lang.Process#getErrorStream()
	 * @return The error stream
	 */
	public InputStream getErrorStream() {
		return err;
	}

	/**
	 * @see java.lang.Process#getInputStream()
	 * @return The input stream
	 */
	public InputStream getInputStream() {
		return in;
	}

	/**
	 * @see java.lang.Process#getOutputStream()
	 * @return The output stream
	 */
	public OutputStream getOutputStream() {
		return out;
	}
	
	/**
	 * Stop this process
	 * @param exitValue
	 */
	protected synchronized void exit(int exitValue) {
		this.exitValue = exitValue;
		this.running = false;
		notifyAll();
	}

	/**
	 * @see java.lang.Process#waitFor()
	 * @return The exit value
	 * @throws InterruptedException
	 */
	public synchronized int waitFor() throws InterruptedException {
		while (running) {
			wait();
		}
		return exitValue;
	}
	
	/**
	 * Class used as new process thread.
	 * @author epr
	 */
	class ProcessRunner
	implements Runnable {
		
		/**
		 * Run the process
		 * @see java.lang.Runnable#run()
		 */
		public void run() {
			try {
				final Class mainClass = Class.forName(mainClassName);
				final Method mainMethod = mainClass.getMethod("main", new Class[] { String[].class });
		
				try {		
					mainMethod.invoke(null, new Object[] { args });
				} catch (InvocationTargetException ex) {
					ex.getTargetException().printStackTrace();		
				}
			} catch (Exception ex) {
				ex.printStackTrace();
			}
		}
		
	}

}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?