java--Progress类的使用浅析
Progress的简要说明
Process类是一个抽象类,方法都是抽象的,它封装了一个进程,也就是一个可执行的程序
ProcessBuilder.start()
和Runtime.exec
方法创建一个本机进程并返回Process子类的一个实例,该实例可以控制进程并获取相关的信息
- ProcessBuilder与Process类的区别
ProcessBuilder为进程提供了更多的控制,例如,可以设置当前工作目录,还可以改变环境参数。而Process的功能相对来说简单的多。 - Runtime.exec使用
- Runtime类封装了运行时的环境。每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接。
- 一般不能实例化一个Runtime对象,应用程序也不能创建自己的 Runtime 类实例,但可以通过 getRuntime 方法获取当前Runtime运行时对象的引用。
- 一旦得到了一个当前的Runtime对象的引用,就可以调用Runtime对象的方法去控制Java虚拟机的状态和行为。
- 当Applet和其他不被信任的代码调用任何Runtime方法时,常常会引起SecurityException异常。
- 应用实例:
方法的使用说明:
* destory()方法杀死子进程
* waitFor()方法等待程序直到子程序结束
* exitValue()方法返回子进程结束时返回的值
下面是代码的实现:
ProcessTest的实现类
package net;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Arrays;
public class ProcessTest {
// 列出所有进程
public static void main(String args[]) {
ProcessTest pt = new ProcessTest();
// pt.createProcess(args);
// pt.scanProcess();
pt.runtimeUse();
}
/**
* runtime的使用2
* Process的使用
* destory()方法杀死子进程
* waitFor()方法等待程序直到子程序结束
* exitValue()方法返回子进程结束时返回的值
*/
public void runtimeUse(){
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());
}
/**
* tasklist 获得进程句柄
* 进行扫描当前系统的所有进程
*/
public void scanProcess(){
BufferedReader br = null;
try {
Process proc = Runtime.getRuntime().exec("exefile"); //获得进程句柄
br = new BufferedReader(
new InputStreamReader(proc.getInputStream()));
String line = null;
String pid = null;
int num = 0;
System.out.println("打印所有正在运行的进程信息");
while ((line = br.readLine()) != null) {
System.out.println(line);
num++;
}
System.out.println("一共有" + num + "个进程");
System.out.println("pid为" + pid);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
/**
* 使用ProcessBuilder来创建一个process进程,去找e盘目录下的东西
*/
public Process createProcess(String[] args){
Process process=null;
try {
ProcessBuilder builder = new ProcessBuilder("cmd", "/c", "dir");
builder.directory(new File("e:/"));
process=builder.start();
InputStream is=process.getInputStream();
InputStreamReader isr=new InputStreamReader(is,"GBK");
BufferedReader br=new BufferedReader(isr);
String line;
System.out.printf("Output of running %s is:", Arrays.toString(args));
while((line=br.readLine())!=null){
System.out.println(line);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
//进行关闭流
}
return process;
}
/**配合scanProces进行使用
*
* @param line
* 输出此行的进程信息
* @param pid
* 进程的pid
* @return 是否执行成功
*
*/
public boolean killPid(String line, String pid) {
boolean isSuccess = false;
if (line.contains(pid)) {
// 获得pid,-7已经假设最大的进程pid为5位,外加一个空格
pid = line.substring(line.indexOf("Console") - 7,
line.indexOf("Console")); // indexof返回第一个字符出现的索引
try {
Runtime.getRuntime().exec("tskill " + pid);
isSuccess = true;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return isSuccess;
}
}
RunTime的测试类:
package net;
public class RunTimeTest {
public static void main(String[] args){
RunTimeTest rt=new RunTimeTest();
rt.memoryDemo();
}
/**
* 内存管理
*/
public void memoryDemo(){
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("Initial free is : " + mem1);
r.gc();
mem1 = r.freeMemory();
System.out.println("Free memory after garbage collection : " + mem1);
//allocate integers
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 : " +(mem1-mem2));
//discard Intergers
for(int i=0; i<1000; i++) someints[i] = null;
r.gc(); //request garbage collection
mem2 = r.freeMemory();
System.out.println("Free memory after collecting " + "discarded integers : " + mem2);
}
}