全部博文(2065)
分类: Java
2010-05-04 16:21:52
Runtime与Process类整理
[学习时间:
每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接。可以通过
getRuntime 方法获取当前运行时。 应用程序不能创建自己的 Runtime 类实例。
示例:Runtime r =
Runtime.getRuntime();
这样一来就表示当前这个应用已经与其运行的环境相连接了。可以设置与获取其当前环境的情况
方法摘要 |
|
void |
( hook) |
int |
()
向 Java 虚拟机返回可用处理器的数目。 |
|
( command) 在单独的进程中执行指定的字符串命令。 Runtime r = Runtime.getRuntime(); try { Process p = r.exec("ifconfig"); } catch (IOException e) { // TODO Auto-generated
catch block e.printStackTrace(); } 表示新开一个进程了。 |
|
([] cmdarray) |
|
([] cmdarray, [] envp) |
|
([] cmdarray, [] envp, dir) |
|
( command, [] envp) |
|
( command, [] envp, dir) |
void |
(int status)
|
long |
()
|
void |
()
|
static |
()
|
void |
(int status)
|
void |
( filename) |
void |
( libname) |
long |
()
|
boolean |
( hook) |
void |
()
|
long |
()
|
void |
(boolean on)
|
void |
(boolean on)
|
示例1.演示如何给JVM添加新的勾子进来
import java.io.FileWriter;
import java.util.Date;
public class Runtimes {
public Runtimes() {
doShutDownWork();
}
//当应用程序在退出JVM的时候做一件事情。就是新开一个勾子程序过来处理
private void doShutDownWork() {
Runtime.getRuntime().addShutdownHook(new Thread(){
@Override
public void run() {
try {
FileWriter fw = new FileWriter("c:\\t.log");
System.out.println("it is going to end");
fw.write("The app ended!" + (new
Date().toString()));
fw.close();
System.gc();
} catch (Exception e) {
// TODO: handle
exception
}
}
});
}
public static void main(String[] args) {
Runtimes utils = new Runtimes();
long s = System.currentTimeMillis();
for (long i = 0; i < 2000000000; i++) {
}
long se = System.currentTimeMillis();
System.out.println(se- s);
}
}
( hook)
注册新的虚拟机来关闭钩子。即当我们的应用程序在退出的时候可以做一件事情。我想能否这样在一些应用程序的退出时候调用System.gc()强制回收内存!
Process 类使用整理
和
方法创建一个本机进程,并返回 Process 子类的一个实例,该实例可用来控制进程并获得相关信息。Process
类提供了执行从进程输入、执行输出到进程、等待进程完成、检查进程的退出状态以及销毁(杀掉)进程的方法。
笔记:这个类是实现管理进程用的。
它的所有标准 io(即 stdin、stdout 和 stderr)操作都将通过三个流 (、
和
)
重定向到父进程。父进程使用这些流来提供到子进程的输入和获得从子进程的输出。因为有些本机平台仅针对标准输入和输出流提供有限的缓冲区大小,如果读写子进程的输出流或输入流迅速出现失败,则可能导致子进程阻塞,甚至产生死锁。
笔记:因为Process其实是开了一个新的子进程出来了。其是依托于当前正在运行JVM父进程了。
对于带有 Process 对象的 Java 进程,没有必要异步或并发执行由 Process 对象表示的进程。
方法摘要 |
|
abstract void |
()
|
abstract int |
()
|
abstract |
()
|
abstract |
()
|
abstract |
()
|
abstract int |
()
|
Runtime r = Runtime.getRuntime();
try {
Process p = r.exec("ipconfig");
String inline;
BufferedReader br=new BufferedReader(new InputStreamReader(p.getInputStream()));
try {
while(null!=(inline=br.readLine())){
System.out.println(inline);
}
} catch (IOException e) {
e.printStackTrace();
}
} catch (IOException e) {
// TODO Auto-generated
catch block
e.printStackTrace();
} finally {
//记得 ()
杀掉子进程
}
父进程想要获取到子进程的数据流并没有标准的IO实现stdin stdout stderr的。只有依据通过
abstract |
()
|
abstract |
()
|
这样的JAVA IO类包来实现其功能!
留下一个问题:能否在父进程直接运行系统命令。而不调用子进程呢?