1. 管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信。
    创建子进程Java有两种方式

    //第一种
    Runtime rt = Runtime.getRuntime();
    Process process = rt.exec("java -jar app2.jar");
    //第二种
    ProcessBuilder pb = new ProcessBuilder("java", "-jar","app2.jar");
    Process p = pb.start();

    第二种方式操作更方便,实例如下。
    父进程App.class

    try{
    ProcessBuilder pb=new ProcessBuilder("java -jar app2.jar".split(" "));
    pb.directory(new File("e:/temp/clean_day/jar/"));
    //标准错误和输入流合并为输入流
    pb.redirectErrorStream(true);
    //创建子进程
    Process p=pb.start(); //使用Process的输入流接收子进程发送的消息
    BufferedReader br=new BufferedReader(new InputStreamReader(p.getInputStream()));
    //使用Process的输出流向子进程发送消息,并把PrintWriter设置为自动flush.
    PrintWriter wr=new PrintWriter(new OutputStreamWriter(p.getOutputStream()),true);
    String lineStr;
    while((lineStr=br.readLine())!=null){
    System.out.println("收到子进程的消息:"+lineStr);
    //向子进程发送消息
    wr.println(System.currentTimeMillis());
    }
    wr.close();
    br.close();
    }catch(Exception ex){
    System.out.println(ex.getMessage());
    }

    子进程App2.class

    try{
    System.out.println("子进程启动成功");
    System.out.println(System.currentTimeMillis()); //利用标准输入来接收父进程发送的消息
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String lineStr;
    while ((lineStr = br.readLine()) != null) {
    System.out.println("child\t"+lineStr);
    }
    br.close();
    }catch(Exception ex){
    System.out.println(ex.getMessage());
    }
  2. (非进程,而是线程)PipedInputStream、PipedOutStream、PipedReader、PipedWriter管道流
    public class App {
    
    	public static void main(String[] args) {
    PpWriter wr=new PpWriter();
    PpReader rd=new PpReader(wr); Thread wrth=new Thread(wr);
    wrth.start(); Thread rdth=new Thread(rd);
    rdth.start();
    }
    } /**
    * 管道写
    * App.java:Temp
    * 2015年3月26日
    * @author kevin.zhai(韩旭)
    */
    class PpWriter implements Runnable{
    private PipedWriter pipedWriter; public PpWriter(){
    this.pipedWriter=new PipedWriter();
    } @Override
    public void run() {
    try {
    while(true){
    //因为读使用了readline,因此这里要换行
    String sendStr=System.currentTimeMillis()+"\r\n";
    this.pipedWriter.write(sendStr);
    System.out.println("父发送:"+sendStr);
    Thread.sleep(1000);
    }
    } catch (IOException | InterruptedException e) {
    e.printStackTrace();
    }
    } public PipedWriter getPipedWriter() {
    return pipedWriter;
    }
    } /**
    * 管道读
    * App.java:Temp
    * 2015年3月26日
    * @author kevin.zhai(韩旭)
    */
    class PpReader implements Runnable{
    private PipedReader pipedReader; public PpReader(PpWriter ppWriter){
    try {
    //读需要先和写建立连接,否则报异常:Pipe not connected
    this.pipedReader=new PipedReader(ppWriter.getPipedWriter());
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    @Override
    public void run() { try(BufferedReader br=new BufferedReader(this.pipedReader)){
    while(true){
    System.out.println("子接收:"+br.readLine());
    }
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }

Java进程通讯的更多相关文章

  1. android中跨进程通讯的4种方式

    转自:http://blog.csdn.net/lyf_007217/article/details/8542359 帖子写的很好.看来一遍,试了一遍,感觉太有意义.必须转过来! android中跨进 ...

  2. Chris Richardson微服务翻译:构建微服务之微服务架构的进程通讯

    Chris Richardson 微服务系列翻译全7篇链接: 微服务介绍 构建微服务之使用API网关 构建微服务之微服务架构的进程通讯(本文) 微服务架构中的服务发现 微服务之事件驱动的数据管理 微服 ...

  3. Android查缺补漏(IPC篇)-- 款进程通讯之AIDL详解

    本文作者:CodingBlock 文章链接:http://www.cnblogs.com/codingblock/p/8436529.html 进程间通讯篇系列文章目录: Android查缺补漏(IP ...

  4. 故障重现, JAVA进程内存不够时突然挂掉模拟

    背景,服务器上的一个JAVA服务进程突然挂掉,查看产生了崩溃日志,如下: # Set larger code cache with -XX:ReservedCodeCacheSize= # This ...

  5. 死磕内存篇 --- JAVA进程和linux内存间的大小关系

    运行个JAVA 用sleep去hold住 package org.hjb.test; public class TestOnly { public static void main(String[] ...

  6. android 史上最简单易懂的跨进程通讯(Messenger)!

    不需要AIDL也不需要复杂的ContentProvider,也不需要SharedPreferences或者共享存储文件! 只需要简单易懂的Messenger,它也称为信使,通过它可以在不同进程中传递m ...

  7. Linux下java进程CPU占用率高-分析方法

    今天登陆同事的一台gateway 开始以为hive环境登陆不了了,仔细一看看了下是因为机器很卡,我每次等几秒没登陆就ctrl+c了,看了下是有个java进程cpu:340.4%  mem:14.6%  ...

  8. Linux下java进程CPU占用率高分析方法

    Linux下java进程CPU占用率高分析方法 在工作当中,肯定会遇到由代码所导致的高CPU耗用以及内存溢出的情况.这种情况发生时,我们怎么去找出原因并解决. 一般解决方法是通过top命令找出消耗资源 ...

  9. Linux删除多个java进程的其中一个

    一.背景: Linux后台运行了多个Java程序,进程名都是java. 执行pkill java会一次性杀掉所有的java进程. 二.解决思路: 先通过一定的检索条件,定位出指定的java进程 然后解 ...

随机推荐

  1. 定制jackson的自定义序列化(null值的处理)

    http://www.cnblogs.com/lic309/p/5048631.html

  2. js架构设计模式——MVC,MVP 和 MVVM 的图示及简单明了的区别说明

    MVC,MVP 和 MVVM 的图示 复杂的软件必须有清晰合理的架构,否则无法开发和维护. MVC(Model-View-Controller)是最常见的软件架构之一,业界有着广泛应用.它本身很容易理 ...

  3. LINQ to Sql系列二 简单查询和联接查询

    这一篇文章主要总结LINQ to sql的简单查询(单表查询)和联接查询(多表查询) 单表查询 需求是我们要输出TClass表中的结果.使用了from-in-select语句,代码如下: public ...

  4. 如何在NodeJS项目中优雅的使用ES6

    如何在NodeJS项目中优雅的使用ES6 NodeJs最近的版本都开始支持ES6(ES2015)的新特性了,设置已经支持了async/await这样的更高级的特性.只是在使用的时候需要在node后面加 ...

  5. MyBatis:学习笔记(3)——关联查询

    MyBatis:学习笔记(3)--关联查询 关联查询 理解联结 SQL最强大的功能之一在于我们可以在数据查询的执行中可以使用联结,来将多个表中的数据作为整体进行筛选. 模拟一个简单的在线商品购物系统, ...

  6. Hadoop权威指南:HDFS-Hadoop存档

    Hadoop权威指南:HDFS-Hadoop存档 [TOC] 每个文件按块方式存储, 每个块的元数据存储在namenode的内存中 Hadoop存档文件或HAR文件是一个更高效的文件存档工具,它将文件 ...

  7. Wireshark网络抓包(二)——过滤器

    一.捕获过滤器 选中捕获选项后,就会弹出下面这个框,在红色输入框中就可以编写过滤规则. 1)捕获单个IP地址 2)捕获IP地址范围 3)捕获广播或多播地址 4)捕获MAC地址 5)捕获所有端口号 6) ...

  8. JAVA传值与传址

    要了解JAVA中的传值与传址问题,必要先要了解JVA中的栈内存和堆内存,>>>>点些查看<<<<昨天写的学习记录 栈:基本数据类型.数据的引用变量,这两 ...

  9. Swift 2.2 多态和强制转换

    写在前面: 写点东西,就是想告诉自己,有时间其实你也在前进着,快慢不说,至少没停下吧!该有的都会有的.不瞎BB了,说主题,3.0 的多态和继承. 总觉得继承好像也没什么太多的可说的了,在项目中用到的还 ...

  10. Arduino入门学习

    一直听到许多做物联网.智能家居的控制器使用的是Arduino,从师兄那里拿到了一块Arduino开发板,进行了一下午的学习,感觉这个适合小孩子们玩:) 废话少说,总结一下,便于以后可能会用得到.我主要 ...