Java多進程管道通信

任務:
設計一個父進程,三個子進程(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();
    }
    }
    }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章