博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java多进程管道通信
阅读量:7086 次
发布时间:2019-06-28

本文共 2452 字,大约阅读时间需要 8 分钟。

任务:

设计一个父进程,三个子进程(A,B,C)。子进程A,B同时被父进程启动来计算(不实现具体的计算任务,先用CPU空跑来代替)。进程A计算5分钟,而进程B计算8分钟。当进程A,B都计算完成后才能启动进程C,进程C计算3分钟。

Java中的管道:

Java程序中可以启动其他的应用程序,这种在Java中启动的进程称为子进程,启动子进程的Java程序称为父进程,其实这个父进程就是一个Java虚拟机。在Java程序中可以用Process类的实例对象来表示子进程,子进程的标准输入和输出不在连接到键盘和显示器(也就是不再接收键盘输入,和显示器输出),而是以管道流的形式连接到父进程的一个输出流和输入流对象上。
调用Process类的getOutputStream和getInputStream方法可以获得连接到子进程的输出流和输入流对象。子进程从标准输入读到的内容就是父进程通过输出流对象写入到它们俩之间的进程管道中的数据,子进程写入的标准输出的数据通过它们之间的进程管道传递到了父进程的输入流对象中,父进程从这个输入流对象中读取到的内容就是子进程写入到标准输出的数据编程实例。

  1. 思路:

    a) 建立A B C三个类文件,空跑模拟进程运行。
    b) 在父进程中通过Runtime.exec()启动各子进程。
    c) 子进程与父进程的通信通过上述管道实现,子进程完成后发出一个信息,父进程通过接收线程不断接收信息并判断子进程是否完成并决定下一进程启动与否。

  2. 代码:
    Father.java
    import java.io.*;
    class Father implements Runnable {
    //获取子进程的对象
    Process p = null;
    Process q = null;
    Process r = null;
    public Father() throws Exception {
    //启动AB进程
    p = Runtime.getRuntime().exec("java A");
    q=Runtime.getRuntime().exec("java B");
    new Thread(this).start();
    }
    //定义接收线程
    public void run() {
    Boolean f=true;
    try{
    InputStream inp = p.getInputStream();
    InputStream inq = q.getInputStream();
    BufferedReader bfrp = new BufferedReader(new InputStreamReader(inp));
    BufferedReader bfrq = new BufferedReader(new InputStreamReader(inq));
    while(f) {
    String str=bfrp.readLine();
    String str1=bfrq.readLine();
    //判断进程是否完成
    if(str.equals("1")&&str1.equals("1")){
    System.out.println("AB");
    r=Runtime.getRuntime().exec("java C");
    InputStream inr = r.getInputStream();
    BufferedReader bfrr = new BufferedReader(new InputStreamReader(inr));
    String str2=bfrr.readLine();
    if (str2!=null&&str2.equals("1"))
    {
    System.out.println("C");
    f=false;
    }
    }
    }
    } catch(Exception e) {
    e.printStackTrace();
    }
    }
    public static void main(String args[]) throws Exception {
    Father f = new Father();
    }
    }
    //进程A
    A. Java
    public class A {
    public static void main(String args[]) {
    int i=0;
    while(true) {
    try{
    Thread.sleep(1000);
    i++;
    if(i==30) {
    System.out.println("1");
    }
    if(i>30)
    break;
    } catch(Exception e) {
    e.printStackTrace();
    }
    }
    }
    }
    //进程B
    B. Java
    public class B {
    public static void main(String args[]) {
    int i=0;
    while(true) {
    try{
    Thread.sleep(1000);
    i++;
    if(i==48) {
    System.out.println("1");
    }
    if(i>48){
    break;
    }
    } catch(Exception e) {
    e.printStackTrace();
    }
    }
    }
    }
    //进程C
    C. Java
    public class C {
    public static void main(String args[]) {
    int i=0;
    while(true) {
    try{
    Thread.sleep(1000);
    i++;
    if(i==18) {
    System.out.println("1");
    }
    if(i>18){
    break;
    }
    } catch(Exception e) {
    e.printStackTrace();
    }
    }
    }
    }

转载于:https://blog.51cto.com/13958494/2177892

你可能感兴趣的文章
[转载]UML用例图总结
查看>>
LinkedBlockingQueue
查看>>
Lucene.Net+盘古分词器(详细介绍)(转)
查看>>
HDU 4902 Nice boat(线段树)
查看>>
正确理解Python文件读写模式字w+、a+和r+
查看>>
不可不知的DIP、IoC、DI以及IoC容器
查看>>
大漠教程 找字 找图片
查看>>
不同时间复杂度的规模上限
查看>>
Codeforces Round #114 (Div. 1) E. Wizards and Bets 高斯消元
查看>>
怎样调通微信支付及微信发货通知接口(Js API)
查看>>
Android 属性动画(Property Animation) 全然解析 (下)
查看>>
推断汉字正則表達式更严谨方法!
查看>>
如何避免误删CleanMyMac语言文件
查看>>
Linux下免安装mysql
查看>>
jquery实现返回基部案例效果
查看>>
快钱报错:javax.net.ssl.SSLProtocolException: handshake alert: unrecognized_name解决
查看>>
Hadoop集群WordCount运行详解(转)
查看>>
[转]SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
查看>>
一次性搞清楚equals和hashCode
查看>>
Android Studio IDE的 LogCat如何过滤指定应用的调试信息
查看>>