【第22期】观点:IT 行业加班,到底有没有价值?

Runtime类

转载 2016年06月02日 11:33:59

Runtime类:是一个与JVM运行时环境有关的类,这个类是Singleton的。
1、Runtime.getRuntime()可以取得当前JVM的运行时环境,这也是在Java中唯一一个得到运行时环境的方法。
2、Runtime上其他大部分的方法都是实例方法,也就是说每次进行运行时调用时都要用到getRuntime方法。
3、Runtime中的exit方法是退出当前JVM的方法,估计也是唯一的一个吧,因为我看到System类中的exit实际上也是通过调用Runtime.exit()来退出JVM的,这里说明一下Java对Runtime返回值的一般规则(后边也提到了),0代表正常退出,非0代表异常中止,这只是Java的规则,在各个操作系统中总会发生一些小的混淆。
例如: Process pro = run.exec("javac");
        int exitVal = pro.exitValue() ;
                System.out.println("退出的值:"+exitVal);
              报错:process has not exited

原因:因为exitValue这个方法是不阻塞的,程序在调用这个方法时外部命令并没有返回所以造成了异常的出现,这里是由另外的方法来等待外部命令执行完毕的,就是waitFor方法。因为当你在一个Process上调用waitFor方法时,当前线程是阻塞的,如果外部命令无法执行结束,那么你的线程就会一直阻塞下去,这种意外会影响我们程序的执行。
例如:               int exitVal = pro.waitFor() ;
System.out.println("退出的值:"+exitVal);
效果:程序也无法执行完成,它没有输出但却一直悬在那里。
原因:因为本地的系统对标准输入和输出所提供的缓冲池有效,所以错误的对标准输出快速的写入和从标准输入快速的读入都有可能造成子进程的锁,甚至死锁。
例如:                InputStream stderr = pro.getErrorStream();
 InputStreamReader isr = new InputStreamReader(stderr);
 BufferedReader br = new BufferedReader(isr);
 String line = null;
 while ( (line = br.readLine()) != null)
 System.out.println(line);
 System.out.println("");
 int exitVal = pro.waitFor();
 System.out.println("Process exitValue: " + exitVal);
结果:有结果。为了处理好外部命令大量输出的情况,你要确保你的程序处理好外部命令所需要的输入或者输出。

 

Sun的doc里其实说明还有其他的用法:
exec(String[] cmdarray, String[] envp, File dir)
Executes the specified command and arguments in a separate process with the specified environment and working directory.
那个dir就是调用的程序的工作目录,这句其实还是很有用的。
Windows下调用程序
Process proc =Runtime.getRuntime().exec("exefile");
Linux下调用程序就要改成下面的格式
Process proc =Runtime.getRuntime().exec("./exefile");
Windows下调用系统命令
String [] cmd={"cmd","/C","copy exe1 exe2"};
Process proc =Runtime.getRuntime().exec(cmd);
Linux下调用系统命令就要改成下面的格式
String [] cmd={"/bin/sh","-c","ln -s exe1 exe2"};
Process proc =Runtime.getRuntime().exec(cmd);
Windows下调用系统命令并弹出命令行窗口
String [] cmd={"cmd","/C","start copy exe1 exe2"};
Process proc =Runtime.getRuntime().exec(cmd);
Linux下调用系统命令并弹出终端窗口就要改成下面的格式
String [] cmd={"/bin/sh","-c","xterm -e ln -s exe1 exe2"};
Process proc =Runtime.getRuntime().exec(cmd);
还有要设置调用程序的工作目录就要
Process proc =Runtime.getRuntime().exec("exeflie",nullnewFile("workpath"));
当然最好的执行系统命令的方法就是写个bat文件或是shell脚本。然后调用,那样修改和实现就简点多了。

举报

相关文章推荐

深入研究java.lang.Runtime类

一、概述       Runtime类封装了运行时的环境。每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接。       一般不能实例化一个Runtim...

Runtime类

一、概述       Runtime类封装了运行时的环境。每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接。       一般不能实例化一个Runtim...

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

Objective-C Runtime 运行时之一:类与对象

原文地址:http://www.cocoachina.com/ios/20141031/10105.html Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事...

Objective-C Runtime 运行时之一:类与对象

本文章转载自:南峰子的技术博客 Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理。这种动态语言的优势在于:我们写代码时更具灵活性,如我们可以把消息转...

XZ_iOS之Runtime使用运行时获取类的属性列表

简介 运行时是一种面向对象的编程语言的运行环境。类似于Java的虚拟机; OC最主要的特点就是在程序运行时,以发送消息的方式调用方法; 运行时是OC的核心,Objective-C就是基于运行时的...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)