2012-12-20 44 views
1

我使用一個Runnable對象來運行一個processCommand並執行一些需要一些時間的處理(我們稱之爲內部處理)。在內部過程結束時,它會將某些內容寫入文本文件。這個想法是,如果在某個特定的時間裏,內部過程還沒有完成,它必須被終止,所以我使用ExecutorService來處理它。但是如果內部過程比指定的時間更早完成,它將中斷ExecutorService,以便主線程可以繼續執行下一個任務。使用executorservice來控制運行時進程

但問題是,有時候,內部過程根本不會創建文件,或者它創建一個文件,但沒有寫入任何文件。它發生在內部過程比指定時間更早完成時。我不知道我的實現有什麼問題。請注意,如果我手動執行該過程(不使用ExecutorService),該過程將運行良好,並且它會正確寫入所有內容。

我在這裏發佈我的代碼做的工作:

public void process(){ 


    for (int i = 0; i < stoppingTime.length; i++) { 
     for (int j = 2 * i; j < 2 * (i + 1); j++) { 
      final int temp = j; 
      ExecutorService executor = Executors.newSingleThreadExecutor(); 

      Runnable r = new Runnable() { 

       @Override 
       public void run() { 
        Process p = null; 

        int ex = 1; 

        try { 
         p = Runtime.getRuntime().exec(
           processCommand.get(temp)); 

         while (ex != 0) { 
          try { 
           //sleep every 30 second then check the exitValue 
           Thread.sleep(30000); 
          } catch (InterruptedException e) { 

          } 
          ex = p.exitValue(); 
          p.destroy();         
         }       
        } catch (IOException e) { 
         e.printStackTrace(); 
         System.out.println("IOException"); 
        } 
       } 

      }; 

      Future future = executor.submit(r); 

      try { 
       System.out.println("Started.."); 
       future.get(stoppingTime[i], TimeUnit.SECONDS);     
       System.out.println("Finished!"); 
      } catch (TimeoutException e) { 
       System.out.println("Terminated!"); 
      } catch (InterruptedException e) { 
       System.out.println("Future gets InterruptedException"); 
      } catch (ExecutionException e) { 
       System.out.println("Future gets ExecutionException"); 
      } 
      executor.shutdownNow(); 
      System.out.println("shutdown executor"); 
     } 
     System.out.println(); 
    } 

} 
+1

您應該始終使用本機進程的標準輸出流和錯誤流。看看這裏http://www.javaworld.com/jw-12-2000/jw-1229-traps.html – Svilen

+0

@Svilen這是一篇很棒的文章。 – Andreas

回答

0

老問題,想我會嘗試也無妨。

首先,您在雙循環中獲得ExecutorService,與定義的Runnable在同一個塊中。如果您想獲得本機執行的返回值"processCommand",然後像您說的那樣繼續執行下一個任務,那麼您需要在循環之前通過實例化它來重用ExecutorService。其次,stoppingTime[i]intFuture.get(...)需要long

相關問題