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. 【WebService】WebService学习笔记

    WebService三要素 WebService三要素SOAP(Simple Object Access Protocol).WSDL(WebServicesDescriptionLanguage). ...

  2. PHP函数 mysql_real_escape_string 与 addslashes 的区别

    addslashes 和 mysql_real_escape_string 都是为了使数据安全的插入到数据库中而进行的过滤,那么这两个函数到底是有什么区别呢? 首先,我们还是从PHP手册入手: 手册上 ...

  3. PHP 下载远程图片

    方法一:file_get_contents /**-- 下载远程文件 --**/ function down_img($url){ set_time_limit(60); if($url==" ...

  4. 关于aop:pointcut的expression配制说明及JoinPoint

    http://blog.csdn.net/wubai250/article/details/8102194 网上其它示例1:<aop:pointcut id="serviceMetho ...

  5. NodeJS异步I/O解析

    在现在的项目开发中,任何一个大型项目绝对不是简简单单的采用一个种语言和一种框架,因为每种语言和框架各有优势,与其死守一个,不与取各家之所长,依次得到一个高性能.搞扩展的产品. 对于一个.NET开发者, ...

  6. 搭建spring工程配置数据源连接池

    Spring作为一个优秀的开源框架,越来越为大家所熟知,前段时间用搭了个spring工程来管理数据库连接池,没有借助Eclipse纯手工搭建,网上此类文章不多,这里给大家分享一下,也作为一个手记. 工 ...

  7. ReentrantLock获取、释放锁的过程

    看了篇文章,觉得分析得很透彻,其后总结的很到位,地址:http://www.iteye.com/topic/1083832 把获取与释放操作串在一起在简单看一下: 获取锁的时候将当前线程放入同步队列, ...

  8. 深圳尚学堂:Java中Class对象

    Java中生成Class对象和生成instance都有多种方式.所以只有弄清其中的原理,才可以深入理解.首先要生成Class对象,然后再生成Instance.那Class对象的生成方式有哪些呢,以及其 ...

  9. SmartRoute之远程接口调用和负载

    基于接口的调用远比基于基础消息交互来得更简单和便于维护,特别在业务展现上,接口作为业务表现更适合其便利性.为了让SmartRoute更适合业务应用集成,在新的一年开始SmartRoute集成了远程接口 ...

  10. VS编辑器主题变换插件-EasyVS

    主题功能是这个版本的亮点. 我收集了七个比较流行的编辑器主题样式,有了这个功能再也不用到网上寻找安装这样那样的主题了. 增加文件右键“在资源管理器中打开”功能 我们知道VS2010对文件夹支持“在资源 ...