歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

JAVA進程waitFor() 阻塞總結

最近在忙著一個模塊的架構,先前采用的是單進程多線程的模式運行,因為可以很好管理。後來為了提高效率,必須把一群不斷運行的線程放出去,好比分配房間樣子,大伙再不用拘束在一個房間形成擁擠的狀態了。

原來啟動一個線程任務的時候是 把容器裡存活對象開啟它的狀態,現在演變成生成一個線程,線程再去啟動一個進程,從而把任務分配出去執行,但是,在一個線程啟動一個進程後,因為要設計到數據通信,比如要等子進程完成後把子進程的結果返回回來。線程啟動它後不可以被掛起。所有子進程需要在一個方法內存活。執行完畢後線程剩下的代碼繼續執行。後來發現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("執行失敗"); 

這樣就可以解決阻塞問題了。

Copyright © Linux教程網 All Rights Reserved