我们常常听到的比较多是如何创建多线程,很少听到如何创建多进程,今天我们来讲解一下如何创建多进程
ProcessBuilder类
ProcessBuilder类是J2SE 1.5在Java.lang中新添加的一个新类,此类用于创建操作系统进程,它提供一种启动和管理进程(也就是应用程序)的方法。在J2SE 1.5之前,都是由Process类处来实现进程的控制管理。每个 ProcessBuilder 实例管理一个进程属性集。start() 方法利用这些属性创建一个新的 Process 实例。start() 方法可以从同一实例重复调用,以利用相同的或相关的属性创建新的子进程。
常用方法
ProcessBuilder(List<String> command) // 利用指定的操作系统程序和参数构造一个进程生成器。 ProcessBuilder(String... command) // 利用指定的操作系统程序和参数构造一个进程生成器。 List<String> command() // 返回此进程生成器的操作系统程序和参数。 ProcessBuilder command(List<String> command) // 设置此进程生成器的操作系统程序和参数。 ProcessBuilder command(String... command) // 设置此进程生成器的操作系统程序和参数。 File directory() // 返回此进程生成器的工作目录。 ProcessBuilder directory(File directory) // 设置此进程生成器的工作目录。 Map<String,String> environment() // 返回此进程生成器环境的字符串映射视图。 boolean redirectErrorStream() // 通知进程生成器是否合并标准错误和标准输出。 ProcessBuilder redirectErrorStream(boolean redirectErrorStream) // 设置此进程生成器的 redirectErrorStream 属性。 Process start() // 使用此进程生成器的属性启动一个新进程。
Process类
使用Process process = processBuilder.start();
启动后,会返回一个Process类的实例代表启动的进程,该实例可用来控制进程并获得相关信息。Process 类提供了执行从进程输入、执行输出到进程、等待进程完成、检查进程的退出状态以及销毁(杀掉)进程的方法:
void destroy() // 杀掉子进程。(一般情况下,该方法并不能杀掉已经启动的进程,不用为好。) int exitValue() // 返回子进程的出口值。(只有启动的进程执行完成、或者由于异常退出后,exitValue()方法才会有正常的返回值,否则抛出异常。) InputStream getErrorStream() // 获取子进程的错误流。(如果错误输出被重定向,则不能从该流中读取错误输出。 ) InputStream getInputStream() // 获取子进程的输入流。(可以从该流中读取进程的标准输出。 ) OutputStream getOutputStream() // 获取子进程的输出流。(写入到该流中的数据作为进程的标准输入。) int waitFor() // 导致当前线程等待,如有必要,一直要等到由该 Process 对象表示的进程已经终止。
示例
ProcessBuilderTest.java 类
import java.io.*; import java.util.*; public class ProcessBuilderTest { public static void main(String[] args) { try { ProcessBuilder processBuilder = new ProcessBuilder(); processBuilder.redirectErrorStream(true); processBuilder.command(new File(System.getProperty("java.home"), "bin/java").toString(), "ProcessTest"); processBuilder.redirectErrorStream(true); processBuilder.directory(new File(ProcessBuilderTest.class.getResource("/").getPath())); Process process = processBuilder.start(); Scanner scanner = new Scanner(process.getInputStream()); while (scanner.hasNextLine()) { System.out.println("Process Logger : " + scanner.nextLine()); } scanner.close(); }catch (IOException e) { e.printStackTrace(); } } }
ProcessTest.java 类
import java.util.Map; public class ProcessTest { public static void main(String[] args) { for (Map.Entry<Object, Object> entry : System.getProperties().entrySet()) { System.out.println(entry.getKey() + " ==> " + entry.getValue()); } } }
运行结果:
localhost:test meyer$ java ProcessBuilderTest Process Logger : java.runtime.name ==> Java(TM) SE Runtime Environment Process Logger : sun.boot.library.path ==> /Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/jre/lib Process Logger : java.vm.version ==> 25.111-b14 Process Logger : gopherProxySet ==> false Process Logger : java.vm.vendor ==> Oracle Corporation Process Logger : java.vendor.url ==> http://java.oracle.com/ Process Logger : path.separator ==> : Process Logger : java.vm.name ==> Java HotSpot(TM) 64-Bit Server VM Process Logger : file.encoding.pkg ==> sun.io Process Logger : user.country ==> CN Process Logger : sun.java.launcher ==> SUN_STANDARD Process Logger : sun.os.patch.level ==> unknown Process Logger : java.vm.specification.name ==> Java Virtual Machine Specification Process Logger : user.dir ==> /Users/meyer/Documents/workspace/me/test Process Logger : java.runtime.version ==> 1.8.0_111-b14 Process Logger : java.awt.graphicsenv ==> sun.awt.CGraphicsEnvironment Process Logger : java.endorsed.dirs ==> /Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/jre/lib/endorsed Process Logger : os.arch ==> x86_64 Process Logger : java.io.tmpdir ==> /var/folders/3d/2_m0wvfs0yq7_tq0b4_r34rc0000gn/T/ Process Logger : line.separator ==> Process Logger : Process Logger : java.vm.specification.vendor ==> Oracle Corporation Process Logger : os.name ==> Mac OS X Process Logger : sun.jnu.encoding ==> UTF-8 Process Logger : java.library.path ==> /Users/meyer/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:. Process Logger : java.specification.name ==> Java Platform API Specification Process Logger : java.class.version ==> 52.0 Process Logger : sun.management.compiler ==> HotSpot 64-Bit Tiered Compilers Process Logger : os.version ==> 10.12.2 Process Logger : user.home ==> /Users/meyer Process Logger : user.timezone ==> Process Logger : java.awt.printerjob ==> sun.lwawt.macosx.CPrinterJob Process Logger : file.encoding ==> UTF-8 Process Logger : java.specification.version ==> 1.8 Process Logger : java.class.path ==> . Process Logger : user.name ==> meyer Process Logger : java.vm.specification.version ==> 1.8 Process Logger : sun.java.command ==> ProcessTest Process Logger : java.home ==> /Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/jre Process Logger : sun.arch.data.model ==> 64 Process Logger : user.language ==> zh Process Logger : java.specification.vendor ==> Oracle Corporation Process Logger : awt.toolkit ==> sun.lwawt.macosx.LWCToolkit Process Logger : java.vm.info ==> mixed mode Process Logger : java.version ==> 1.8.0_111 Process Logger : java.ext.dirs ==> /Users/meyer/Library/Java/Extensions:/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/jre/lib/ext:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java Process Logger : sun.boot.class.path ==> /Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/jre/lib/resources.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/jre/lib/rt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/jre/lib/sunrsasign.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/jre/lib/jsse.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/jre/lib/jce.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/jre/lib/charsets.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/jre/lib/jfr.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/jre/classes Process Logger : java.vendor ==> Oracle Corporation Process Logger : file.separator ==> / Process Logger : java.vendor.url.bug ==> http://bugreport.sun.com/bugreport/ Process Logger : sun.io.unicode.encoding ==> UnicodeBig Process Logger : sun.cpu.endian ==> little Process Logger : sun.cpu.isalist ==> localhost:test meyer$
转载请注明:晓窗博客 » Java中创建多进程