Process
抽象类Process用来封装进程,也就是执行的程序。Process主要用作由RunTime类的exec()方法创建的对象类型或由ProcessBuilder类的start()方法创建的对象类型的超类。
方法 |
描述 |
void destroy() |
终止进程 |
Process destroyForcibly() |
强制终止调用进程。返回对进程的引用(JDK8新增) |
int exitValue() |
返回从子进程获得的退出代码 |
InputStream getErrorStream() |
返回一个输入流,该输入流从进程的err输出流读取输入 |
InputStream getInputStream() |
返回一个输入流,该输入流从进程的out输出流读取输入 |
OutputStream getOutputStream() |
返回一个输出流,该输出流将输出写入到进程的in输入流中 |
boolean isAlive() |
如果调用进程仍然处于活动状态,返回true;否则,返回false(JDK8新增) |
int waitFor() |
返回右进程返回的退出代码,该方法直到调用进程终止时才会返回 |
boolean waitFor(long waitTime, TimeUnit timeUnit) |
等待调用进程结束。等待的时间由waitTime直到,时间单位由timeUnit指定。如果进程已经结束,返回false;如果等待时间用完,返回false(JDK8新增) |
Runtime
Runtime类封装了运行时环境。不能实例化Runtime对象。但是,可以调用静态的Runtime.getRuntime()方法来获得对当前Runtime对象的引用。一旦获得对当前Runtime对象的引用,就可以调用一些方法来控制Java虚拟机(JVM)的状态和行为。applet和其他不信任饿代码如果调用Runtime的任何方法,通常会引起SecurityException异常。
方法 |
描述 |
void addShutdownHook(Thread thrd) |
将thrd注册为Java虚拟机在终止时运行的线程 |
Process exec(String progName) |
作为独立的进程执行progName指定的程序,返回描述新进程的Process类型的对象 |
Process exec(String progName, String environment[]) |
在environment指定的环境中,作为独立的进程执行progName指定的程序,返回描述新进程的Process类型的对象 |
Process exec(String comLineArray[] |
作为独立的进程执行comLineArray中字符串指定的命令行,返回描述新进程的Process类型的对象 |
Process exec(String comLineArray[], String enviroment[]) |
在enviroment指定的环境中,作为独立的进程执行comLineArray中字符串指定的命令行,返回描述新进程的Process类型的对象 |
void exit(int exitCode) |
中断执行,并将exitCode的值返回给父进程。根据约定,0表示正常终止。所以其他值表示某种形式的错误。 |
long freeMomery() |
返回Java运行时系统可以使用的空闲内存的近似字节数 |
void gc() |
开始垃圾回收 |
static RunTime getRuntime() |
返回当前Runtime对象 |
void halt(int code) |
立即终止Java虚拟机,不运行任何终止线程或终结器。code的值被返回给调用进程。 |
void load(String libraryFileName) |
加载libraryFileName指定文件中的动态库,必须指定完整路径 |
void loadLibrary(String libraryName) |
加载名为libraryName的动态库 |
Boolean removeShutdownHook(Thread thrd) |
从Java虚拟机终止时运行的线程列表中移除thrd。如果成功,就返回true,表示线程被成功移除 |
void runFinalization() |
为那些不再使用但是还没有被回收的对象调用finalize()方法 |
long totalMemory() |
返回程序可以利用的内存的总字节数 |
void traceInsntructions(boolena traceOn) |
根据traceOn的值打开或关闭指令跟踪。如果traceOn为true,显示跟踪;如果为false,关闭跟踪 |
void traceMethodCalls(boolean traceOn) |
根据traceOn的值打开或关闭方法调用跟踪。如果traceOn为true,显示跟踪;如果为false,关闭跟踪 |
int availableProcessors() |
获取系统中可用处理器数量 |
内存管理
尽管Java提供了自动的垃圾回收功能,但是有时候会希望了解对象堆(heap)有多大以及剩余的堆空间有多少。例如,可以使用这些信息检查代码的效率,或者评估还可以实例化多少特定类型的对象。为了获取这些信息,可以使用totalMemory()和freeMemory()方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| package Learn;
public class LearnRunTime1 { public static void main(String args[]) { Runtime r = Runtime.getRuntime(); long mem1, mem2; Integer someints[] = new Integer[1000]; System.out.println("Total memory is:" + r.totalMemory()); mem1 = r.freeMemory(); System.out.println("Free memory after garbage collection:" + mem1); for(int i = 0; i < 1000; i++) { someints[i] = new Integer(i); } mem2 = r.freeMemory(); System.out.println("Free memory after allocation:" + mem2); System.out.println("Memory used by allocation:" + (mem2 - mem1)); for(int i = 0; i < 1000; i++) { someints[i] = null; } r.gc(); mem2 = r.freeMemory(); System.out.println("Free memory after collecting" + " discarded Integers:" + mem2); } }
|
执行其他程序
在安全环境中,可以在多任务操作系统下使用Java执行其他重量级的进程(即程序)。有几种形式的exec()方法运行命名希望运行的程序,并允许提供输入参数。exec()方法返回一个Process对象,然后可以使用该对象控制Java程序与这个新运行进程的交互方式。因为Java程序可以运行于各种操作系统下,所以exec()方法是环境独立的。
在新程序开始运行之后,可以通过Process类定义的方法来操作exec()方法返回的Process对象。可以使用destroy()方法杀死子进程。waitFor()方法会导致程序等待,直到子进程结束。exitValue()方法返回子进程结束时返回的值,如果没有任何问题发生的话,这个值通常是0。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| package Learn;
public class LearnRunTime2 { public static void main(String args[]) { Runtime r = Runtime.getRuntime(); Process p = null; try { p = r.exec("notepad"); p.waitFor(); } catch (Exception e) { System.out.println("Error executing notepad"); } System.out.println("Notepad returned" + p.exitValue()); } }
|
ProcessBuilder类
ProcessBuilder提供了另外一种启动和管理进程的方式。在Java,所有进程都是由Process类表示的,并且可以通过Runtime.exec()启动进程。ProcessBuilder为进程提供了更多的控制。
方法 |
描述 |
ProcessBuilder(List args) |
列表形式执行程序 |
ProcessBuilder(String …args) |
变长参数形式执行程序 |
方法 |
描述 |
List command() |
返回对List对象的引用,List对象包含程序的名称以及参数。对List对象的修改会影响调用对象 |
ProcessBuilder command(List args) |
将程序的名称和参数设置由args指定的值。对List对象的修改会影响调用对象。返回对调用对象的引用 |
ProcessBuilder commands(String …args) |
将程序的名称和参数设置为由args指定的值。返回对调用对象的引用 |
File directory() |
返回调用对象的当前工作目录。如果该目录与启动次进程的Java程序的目录相同,那么返回值为null |
ProcessBuilder directory(File dir) |
设置调用对象的当前工作目录,返回对调用对象的引用 |
Map<String, String> enviroment() |
以键/值对的形式返回与调用对象关联的环境变量 |
ProcessBuilder inheritIO() |
使被调用进程为标准I/O流使用与调用进程相同的源和目录 |
ProcessBuilder.Redirect redirectError() |
昨晚ProcessBuilder.Redirect对象放回标准错误的模板 |
ProcessBuilder redirectError(File f) |
将标准错误的目录设置为指定文件,返回调用对象的引用 |
ProcessBuilder redirectError(ProcessBuilder.Redirect target) |
将标准错误的目标设置为target指定的目标,返回对调用对象的引用 |
boolean redirectErrorStream() |
如果标准错误流已经被重定向到标准输出流,就返回true;如果标准错误流被分流,就返回false |
ProcessBuilder redirectErrorStream(boolean merge) |
如果merge为true,就将标准错误流重定向到标准输出;如果merge为false,标准错误流被分离,这是默认状态。返回对调用对象的引用 |
ProcessBuilder.Redirect redirectInput() |
昨晚ProcessBuilder.Redirect对象返回标准输入的源 |
ProcessBuilder redirectInput(File f) |
将标准输入的源设置为指定的文件,返回对调用对象的引用 |
ProcessBuilder redirectInput(ProcessBuilder.Redirect source) |
将标准输入的源设置为source指定的源,返回对调用对象的引用 |
ProcessBuilder.Redirect redirectOutput() |
作为ProcessBuilder.Redirect对象返回标准输出的目标 |
ProcessBuilder redirectOutput(File f) |
将标准输出的目标设置为指定的文件,返回对调用对象的引用 |
ProcessBuilder redirectOutput(ProcessBuilder.Redirect target) |
将标准输出的目标设置为target指定的目标,返回对调用对象的引用 |
Process start() throws IOException |
开始由调用对象指定的进程,也就是运行指定的程序 |
方法 |
描述 |
static ProcessBuilder.Redirect to(File f) |
重定向到写入文件 |
static ProcessBuilder.Redirect from(File f) |
重定向到文件读取 |
static ProcessBuilder.Redirect appendTo(File f) |
重定向到追加文件 |
File file() |
获得链接到文件的File对象 |
1 2 3 4 5 6 7 8 9 10 11 12
| public class LearnProcessBuilder1 { public static void main(String args[]) { try { ProcessBuilder proc = new ProcessBuilder("notepad.exe", "testfile"); proc.start(); } catch (Exception e) { System.out.println("Error execting notepad"); } } }
|