in JDK8 Process ProcessBuilder 进程 ~ read.

Java中的进程

本文基于JDK 1.8.0_45


在Java中当涉及到并发的问题的时候我们一般是使用多线程来解决问题,实际上Java中不仅提供了线程的API,同时也提供的进程的API。之所以大家不太使用进程的API解决并发的问题是因为:

  1. 进程的创建过于昂贵;
  2. 进程的管理依赖于操作系统,不同的操作系统对上层暴露的进程管理的权限是不同的;

Java中的进程API是Process这个抽象类,另外提供了ProcessBuilder的构造类来构造进程。Java中的进程API有以下特性:

  1. 由于进程的管理依赖于操作系统,Java有些时候不对进程的创建做任何保证;
  2. 由于某些操作系统的输入输出流的buffer有限,这导致一些特殊情况下可能读写流会导致进程假死甚至死锁;
  3. 环境变量的设置依赖于操作系统,可能操作系统不允许修改环境变量,也可能操作系统的环境变量的字符集是JDK不支持,这可能会导致问题;

以下是一个简单的例子:

        new ProcessBuilder("ls")
                .directory(new File("/"))
                .inheritIO()
                .start();

以上代码是构建了一个子进程在根目录下执行ls命令,并将输入输出错误流重定向到JRE默认的对应流中。

另外通过以下代码可以打印所有的系统环境变量:

System.out.println(new ProcessBuilder("ls").environment());  
分享按钮