Chinaunix首页 | 论坛 | 博客
  • 博客访问: 26187461
  • 博文数量: 2065
  • 博客积分: 10377
  • 博客等级: 上将
  • 技术积分: 21525
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-04 17:50
文章分类

全部博文(2065)

文章存档

2012年(2)

2011年(19)

2010年(1160)

2009年(969)

2008年(153)

分类: Java

2010-05-04 16:21:52

RuntimeProcess类整理

[学习时间:2010-5-04]

每个 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)
          
通过启动虚拟机的关闭序列,终止当前正在运行的 Java 虚拟机。

 long

()
          
返回 Java 虚拟机中的空闲内存量。不知道单位是什么哦?

 void

()
          
运行垃圾回收器。

static 

()
          
返回与当前 Java 应用程序相关的运行时对象。

 void

(int status)
          
强行终止目前正在运行的 Java 虚拟机。

 void

( filename)
          
加载作为动态库的指定文件名。

 void

( libname)
          
加载具有指定库名的动态库。

 long

()
          
返回 Java 虚拟机试图使用的最大内存量。

 boolean

( hook)
          
取消注册某个先前已注册的虚拟机关闭钩子。

 void

()
          
运行挂起 finalization 的所有对象的终止方法。

 long

()
          
返回 Java 虚拟机中的内存总量。

 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(即 stdinstdout stderr)操作都将通过三个流 ( ) 重定向到父进程。父进程使用这些流来提供到子进程的输入和获得从子进程的输出。因为有些本机平台仅针对标准输入和输出流提供有限的缓冲区大小,如果读写子进程的输出流或输入流迅速出现失败,则可能导致子进程阻塞,甚至产生死锁。

 

笔记:因为Process其实是开了一个新的子进程出来了。其是依托于当前正在运行JVM父进程了。

对于带有 Process 对象的 Java 进程,没有必要异步或并发执行由 Process 对象表示的进程。

方法摘要

abstract  void

()
          
杀掉子进程。如果出现了死锁这种IO堵塞的话就建议杀

abstract  int

()
          
返回子进程的出口值。

abstract  

()
          
获取子进程的错误流。

abstract  

()
          
获取子进程的输入流。

abstract  

()
          
获取子进程的输出流。

abstract  int

()
          
导致当前线程等待,如有必要,一直要等到由该 Process 对象表示的进程已经终止。

 

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类包来实现其功能!

 

留下一个问题:能否在父进程直接运行系统命令。而不调用子进程呢?

 

阅读(853) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~