2011-03-28 75 views
0

我是一個非常新的線程世界的人,現在一直在試圖解決這個問題。線程類中的運行方法未被調用

在Thread類的run方法不會被調用由於某種原因,我不知道爲什麼(但很想知道)

 ProcessBuilder processBuilder = new ProcessBuilder(); 

     processBuilder.command("/bin/sh", "-c", "echo \"w30000001z,none,16488,,181075\nw30000001z,none,16488,,181082\n\" | /home/beehive/bin/exec/tableSize"); 
     Process process = processBuilder.start(); 
     process.waitFor(); 

     InputStream stdin = process.getInputStream(); 
     OutputStream stdout = process.getOutputStream(); 
     InputStream stderr = process.getErrorStream(); 

     BufferedReader reader = new BufferedReader(new InputStreamReader(stdin)); 
     BufferedReader error = new BufferedReader(new InputStreamReader(stderr)); 
     StreamGobbler errorStream = new StreamGobbler(process.getErrorStream(), "ERROR"); 
     StreamGobbler outputStream = new StreamGobbler(process.getInputStream(), "OUTPUT"); 

     errorStream.start(); 
     outputStream.start(); 
     errorStream.join(); 
     outputStream.join(); 

tableSize是一個Python的可執行文件,通過它的標準輸入接受輸入,流程它並輸出幾行文字。我需要收集這個輸出並對它做一些進一步的處理。

有一個單獨的線程來處理inputStream和errorStream上的輸出。這個線程類如下所示。

/* StreamGobbler.java */ 
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.io.PrintWriter; 

class StreamGobbler extends Thread 
{ 
    InputStream is; 
    String type; 
    OutputStream os; 

    StreamGobbler(InputStream is, String type) 
    { 
     this(is, type, null); 

    } 
    StreamGobbler(InputStream is, String type, OutputStream redirect) 
    { 
     this.is = is; 
     this.type = type; 
     this.os = redirect; 
    } 

    public void run() 
    { 
     try 
     { 
      PrintWriter pw = null; 
      if (os != null) 
       pw = new PrintWriter(os); 

      System.out.println("Ajay" + type); 
      InputStreamReader isr = new InputStreamReader(is); 
      BufferedReader br = new BufferedReader(isr); 
      String line=null; 
      while ((line = br.readLine()) != null) 
      { 
       if (pw != null) 
        pw.println(line); 
       System.out.println(type + ">" + line);  
      } 
      if (pw != null) 
       pw.flush(); 
     } catch (IOException ioe) 
      { 
      ioe.printStackTrace(); 
      } 
    } 
} 

由於某些原因,StreamGobbler類中的run方法未被調用。但是這個類的構造函數正在執行。

任何幫助將不勝感激。

+0

我會刪除BufferedReaders。他們似乎沒有任何好處。 – 2011-03-28 10:06:45

回答

9

您需要在之前啓動流飼料器,您可以撥打process.waitFor()

流gobblers讀取並放棄外部進程輸出/錯誤流,以便在嘗試寫入時外部進程不會阻止。但是你擁有它的方式,在你試圖吞噬輸出之前,這個過程必須完成寫作(並退出)。

結果 - 死鎖...如果外部進程寫入太多的輸出流。


其實,我認爲主要的問題是,您的Java代碼不寫什麼inputStream。所以,外部進程就在那裏等待從未到達的輸入......並且process.waitFor()等待外部進程。僵局。

事物的正確順序應該是:

  1. 構建過程和啓動它。
  2. 建立雄火雞並啓動它們。
  3. 打開輸入流。
  4. 將東西寫入輸入流。
  5. 關閉輸入流。
  6. 致電process.waitFor()並檢查進程返回碼。
  7. 看看由Gobblers的
+0

我嘗試過,沒有工作! – ajaymysore 2011-03-28 10:03:58

+0

@coderookie:你究竟做了什麼? – 2011-03-28 10:22:27

+0

如果有幫助,java代碼不會掛起。它通常退出(沒有任何異常),但沒有執行run方法。 – ajaymysore 2011-03-28 10:22:43

1

1)請嘗試卸下WAITFOR ()如果不是必需的。它只會使正在執行的線程等待,直到流程執行完成。

+1

還有一件事你爲什麼需要加入? – Samra 2011-03-28 10:42:50