java-doc-进程

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 开始由调用对象指定的进程,也就是运行指定的程序
  • Redirect常用方法
方法 描述
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");
}
}
}