最近在忙著一個模塊的架構,先前采用的是單進程多線程的模式運行,因為可以很好管理。後來為了提高效率,必須把一群不斷運行的線程放出去,好比分配房間樣子,大伙再不用拘束在一個房間形成擁擠的狀態了。
原來啟動一個線程任務的時候是 把容器裡存活對象開啟它的狀態,現在演變成生成一個線程,線程再去啟動一個進程,從而把任務分配出去執行,但是,在一個線程啟動一個進程後,因為要設計到數據通信,比如要等子進程完成後把子進程的結果返回回來。線程啟動它後不可以被掛起。所有子進程需要在一個方法內存活。執行完畢後線程剩下的代碼繼續執行。後來發現waitFor()方法。挺不錯,可以解決讓子進程在線程的RUN方法就執行完畢,後來發現這個方法並不是想象的那麼美好。它成功的停止了代碼繼續執行,同時它也阻塞了子進程的執行,因為子進程在測試的時候需要及時匯報信息和錯誤信息,如下對代碼進行修改,初步上解決了waitFor()方法阻塞問題
新建一個線程類或者它為內部類
class StreamGobbler extends Thread
{
InputStream is;
String type;
StreamGobbler(InputStream is, String type)
{
this.is = is;
this.type = type;
}
public void run()
{
try
{
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line=null;
while ( (line = br.readLine()) != null)
System.out.println(type + ">" + line);
} catch (IOException ioe)
{
ioe.printStackTrace();
}
}
}
創建子進程的RUN方法
Process proc = Runtime.getRuntime().exec("java com.zjdw.course.Assign " + path);
new StreamGobbler(proc.getInputStream(),"INFO").start();
new StreamGobbler(proc.getErrorStream(),"ERROR").start();
int status = proc.waitFor();
if (status == 0)
System.out.println("執行完畢");
else
System.out.println("執行失敗");
這樣就可以解決阻塞問題了。