Java多进程管道通信

2021-06-21 11:04

阅读:307

标签:false   ack   int   put   计算   readline   tst   run   ++   

任务:
设计一个父进程,三个子进程(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();
    }
    }
    }
    }

Java多进程管道通信

标签:false   ack   int   put   计算   readline   tst   run   ++   

原文地址:http://blog.51cto.com/13958494/2177892


评论


亲,登录后才可以留言!