`

java进程类ProcessBuilder 和 Runtime

    博客分类:
  • Java
 
阅读更多

ProcessBuilder.start() 和 Runtime.exec() 方法都被用来创建一个操作系统进程(执行命令行操作),并返回 Process 子类的一个实例,该实例可用来控制进程状态并获得相关信息。 

Process 类提供了执行从进程输入、执行输出到进程、等待进程完成、检查进程的退出状态以及销毁(杀掉)进程的方法。创建进程的方法可能无法针对某些本机平台上的特定进程很好地工作,比如,本机窗口进程,守护进程,Microsoft Windows 上的 Win16/DOS 进程,或者 shell 脚本。创建的子进程没有自己的终端或控制台。它的所有标准 io(即 stdin、stdout 和 stderr)操作都将通过三个流 (getOutputStream()、getInputStream() 和 getErrorStream()) 重定向到父进程。父进程使用这些流来提供到子进程的输入和获得从子进程的输出。因为有些本机平台仅针对标准输入和输出流提供有限的缓冲区大小,如果读写子 进程的输出流或输入流迅速出现失败,则可能导致子进程阻塞,甚至产生死锁。 当没有 Process 对象的更多引用时,不是删掉子进程,而是继续异步执行子进程。 对于带有 Process 对象的 Java 进程,没有必要异步或并发执行由 Process 对象表示的进程。 

每个ProcessBuilder实例管理一个进程属性集。ProcessBuilder的start()方法利用这些属性创建一个新的Process实例。start()方法可以从同一实例重复调用,以利用相同或者相关的属性创建新的子进程。 

不同点: 
ProcessBuilder.start() 和 Runtime.exec()传递的参数有所不同,Runtime.exec()可接受一个单独的字符串,这个字符串是通过空格来分隔可执行命令程序和参数的;也可以接受字符串数组参数。而ProcessBuilder的构造函数是一个字符串列表或者数组。列表中第一个参数是可执行命令程序,其他的是命令行执行是需要的参数。 
通过查看JDK源码可知,Runtime.exec最终是通过调用ProcessBuilder来真正执行操作的。 

Java代码  收藏代码
  1. import java.io.BufferedReader;  
  2. import java.io.File;  
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5. import java.io.InputStreamReader;  
  6. import java.util.Map;  
  7.   
  8. public class ProcessBuilderTest {  
  9.     public static void restart() throws IOException {  
  10.         // Runtime 例子  
  11.         Process p;  
  12.         // test.bat中的命令是ipconfig/all  
  13.         String cmd = "c:\\test\\test.bat";  
  14.   
  15.         try {  
  16.             // 执行命令  
  17.             p = Runtime.getRuntime().exec(cmd);  
  18.             // 取得命令结果的输出流  
  19.             InputStream fis = p.getInputStream();  
  20.             // 用一个读输出流类去读  
  21.             InputStreamReader isr = new InputStreamReader(fis);  
  22.             // 用缓冲器读行  
  23.             BufferedReader br = new BufferedReader(isr);  
  24.             String line = null;  
  25.             // 直到读完为止  
  26.             while ((line = br.readLine()) != null) {  
  27.                 System.out.println(line);  
  28.             }  
  29.         } catch (IOException e) {  
  30.             e.printStackTrace();  
  31.         }  
  32.   
  33.         // ProcessBuilder 例子 Java程序自重启  
  34.         // 用一条指定的命令去构造一个进程生成器  
  35.         ProcessBuilder pb = new ProcessBuilder("java""-jar""Test3.jar");  
  36.         // 让这个进程的工作区空间改为F:\dist  
  37.         // 这样的话,它就会去F:\dist目录下找Test.jar这个文件  
  38.         pb.directory(new File("F:\\dist"));  
  39.         // 得到进程生成器的环境 变量,这个变量我们可以改,  
  40.         // 改了以后也会反应到新起的进程里面去  
  41.         Map<String, String> map = pb.environment();  
  42.         Process p1 = pb.start();  
  43.         // 然后就可以对p做自己想做的事情了  
  44.         // 自己这个时候就可以退出了  
  45.         System.exit(0);  
  46.     }  
  47. }  
分享到:
评论

相关推荐

    java执行可执行文件,Runtime.exec、ProcessBuilder、commons-exec

    相比于`Runtime.exec()`,`ProcessBuilder`提供了更加强大和灵活的功能,并允许开发者更好地控制进程的执行。`ProcessBuilder`类用于创建操作系统进程,每个`ProcessBuilder`实例管理一系列进程属性,通过`start()`...

    java实现守护进程,有单独的监听进程, 两个或多个进程,两个或多个jvm

    `bin`目录可能包含编译后的可执行文件或脚本,用于启动和管理这些Java进程。为了深入了解实现细节,需要查看源代码并理解其逻辑。 总的来说,Java实现守护进程、监听进程以及管理多个进程和JVM涉及多线程、网络编程...

    深入研究java.lang.ProcessBuilder类.doc

    Java中的`java.lang.ProcessBuilder`类是在J2SE 1.5版本中引入的,用于创建和管理操作系统的进程。这个类提供了比`java.lang.Process`更精细的控制,允许开发者指定启动进程的工作目录、环境变量以及错误和输出流的...

    java 结束word进程

    首先,Java通过`java.lang.ProcessBuilder`和`java.lang.Runtime`类提供了与操作系统交互的能力。这两个类允许我们执行系统命令,包括启动、监控和管理进程。 1. **使用Runtime.exec()方法** `Runtime.getRuntime...

    JAVA进程管理

    综上所述,"JAVA进程管理"项目不仅涵盖了Java中的进程和线程概念,还涉及到了进程的创建、控制、优先级设置以及通过图形界面进行演示,这对于理解和学习Java的系统级编程具有极大的实践价值。通过这个项目,开发者...

    详解Java中多进程编程的实现

    总的来说,Java虽然不以支持多进程而闻名,但通过`ProcessBuilder`和`Runtime`类,开发者仍然可以有效地在Java环境中实现多进程编程,以满足特定的并发和系统集成需求。在实际使用时,应充分考虑进程间的通信和管理...

    用java编的适用于操作系统课程设计的线程-进程管理

    Java虽然不直接支持创建和管理操作系统进程,但可以通过Java的Runtime类或ProcessBuilder类来执行外部命令,间接实现进程操作。例如,可以使用Runtime.getRuntime().exec()方法执行shell命令,从而启动一个新的进程...

    Java程序多进程运行模式的实例分析

    同时,通过`Runtime.exec()`方法和`ProcessBuilder`类,我们可以轻松地创建子进程,并通过相应的输入输出流处理机制实现子进程与父进程之间的通信。这些技术在开发复杂的应用程序时非常有用,尤其是在需要处理大量...

    java进程间tx1

    Java进程间通信(IPC,Inter-Process Communication)是多进程应用程序中实现数据交换的重要机制。在Java中,虽然原生的API对进程间通信的支持不如C++或C那样直接,但依然提供了多种方式来实现这一目标。以下是几种...

    exchange/powershell,Java调用powershell开通邮箱

    - 掌握Java编程,特别是如何使用Java的`ProcessBuilder`或`Runtime.exec()`来执行外部命令。 - 熟悉网络编程,了解如何使用Socket进行进程间的通信。 - 熟悉权限管理和安全实践,因为这涉及到在Java应用中执行...

    java查看内存使用情况,启动新进程。sigar调用

    此外,可能还会有示例展示如何使用Java的`ProcessBuilder`或`Runtime`类来启动新的操作系统进程。 在实际应用中,可能需要定期获取系统信息并进行分析,例如,你可以创建一个定时任务来周期性地获取内存使用情况,...

    java 获取指定的进程id

    然而,我们可以通过Java的`Runtime.exec()`方法或者`ProcessBuilder`类来执行操作系统特定的命令,然后解析输出结果来获取进程ID。 对于Windows系统,可以使用`tasklist`命令,而在Unix/Linux系统上,可以使用`ps`...

    深入研究java.lang.Process类.doc

    ProcessBuilder.start() 和 Runtime.exec 方法创建一个本机进程,并返回 Process 子类的一个实例,该实例可用来控制进程并获取相关信息。 二、API 预览 1. destroy():杀掉子进程。 2. exitValue():返回子进程的...

    Runtime 执行bat

    当我们需要在Java程序中执行系统命令,比如运行一个批处理脚本(.bat文件)时,`Runtime`类或者其扩展类`ProcessBuilder`就派上了用场。下面我们将深入探讨如何使用`Runtime`执行bat脚本,并了解相关知识点。 1. **...

    java源码:进程通信.rar

    综上所述,"java源码:进程通信.rar"这个压缩包可能包含了一系列Java进程通信的实例代码,通过学习这些示例,开发者可以更好地理解和掌握Java中不同进程间通信的原理和实现方法,从而在实际项目中灵活运用。

    java中调用控制台程序

    以上就是关于"java中调用控制台程序"的基本概念和实践方法,包括使用Runtime和ProcessBuilder执行系统命令,以及如何调用wget工具。在实际应用中,可能还需要根据具体需求进行错误处理、进程通信等更复杂的操作。...

    Java程序多进程运行模式的实例分析.pdf

    Java中可以使用两种方法来实现多进程运行模式,一种是使用Runtime中的exec方法执行java classname,另一种是使用ProcessBuilder类创建子进程。 使用Runtime中的exec方法执行java classname可以启动新的Java子进程...

    java utils 工具类

    在Java中,我们可以使用`java.lang.ProcessBuilder`或`Runtime.getRuntime().exec()`来执行系统命令并获取其结果。`ProcessUtil`可能封装了这些功能,提供了更安全、更方便的接口来管理和控制进程。 ### 3. 使用`...

    java 操作脚本启动服务

    1. **Java ProcessBuilder 和 Runtime.exec()**:Java提供了两种方式来执行外部命令,即`Runtime.exec()`和`ProcessBuilder`。它们都可以用来启动服务或者执行系统命令,但`ProcessBuilder`更强大,允许设置环境变量...

    Java执行dos命令

    总结,Java执行DOS命令主要涉及Runtime类和ProcessBuilder类的使用,包括创建进程、读取输出、异常处理等多个方面。理解并熟练运用这些知识点,可以让我们在Java程序中更加自如地与操作系统交互。

Global site tag (gtag.js) - Google Analytics