本站公告: PUI正式上线,欢迎体验。

Java中创建多进程

技巧积累 Mignon 3781浏览 0评论

我们常常听到的比较多是如何创建多线程,很少听到如何创建多进程,今天我们来讲解一下如何创建多进程

ProcessBuilder类

ProcessBuilder类是J2SE 1.5在Java.lang中新添加的一个新类,此类用于创建操作系统进程,它提供一种启动和管理进程(也就是应用程序)的方法。在J2SE 1.5之前,都是由Process类处来实现进程的控制管理。每个 ProcessBuilder 实例管理一个进程属性集。start() 方法利用这些属性创建一个新的 Process 实例。start() 方法可以从同一实例重复调用,以利用相同的或相关的属性创建新的子进程。 

Java中创建多进程 编程优化 常用工具包 技巧积累 第1张

常用方法

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中创建多进程

与本文相关的文章

游客
发表我的评论 换个身份
取消评论

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  • 验证码 (必填)点击刷新验证码