2013-01-14 166 views
-2

我想從java調用一個shell腳本。它可以使用Runtime.exec方法完成。但問題是shell腳本需要大約3-4個小時才能執行,並且建議不要將Process.waitFor()應用於如此長的進程,因爲它會使當前線程保持等待狀態4個小時。這將發生在多線程環境中,其中幾個Java線程將調用多個shell腳本,每個腳本耗費3個多小時。 (雖然線程的數量很小)從Java代碼調用shell腳本

我怎樣才能使它異步,以便我的java進程不必等待,並以某種方式知道何時完成shell腳本。我沒有選擇使用JMS。

請提出一個可靠的解決方案。

回答

2

使用CallableFuture異步啓動腳本,您可以在單獨的線程等待它

+0

是的,這是真的,但我的問題是,等待這麼長時間的採取過程是可取的嗎?難道它不是真正的異步嗎? – Hemanshu

+0

否 - 如果您確定一旦啓動它就不需要關心,是的 - 如果您需要在完成時執行某些操作或處理可能會引發的異常 –

0

這可能是一些像

class AsyncProcessRunner { 

    class AsyncProcess implements Runnable { 
     String cmd; 
     int rc; 
     String out; 
     String err; 

     AsyncProcess(String cmd) { 
      this.cmd = cmd; 
     } 

     @Override 
     public void run() { 
      // run process here 
      processEnded(this); 
     } 
    } 

    void processEnded(AsyncProcess p) { 
     // process termination 
    } 

    public void runAsync(String cmd) { 
     new Thread(new AsyncProcess(cmd)).start(); 
    } 
0

但問題是shell腳本將花費大約需要3-4小時才能執行,並且不建議將Process.waitFor()應用於如此長的進程,因爲它將使當前線程保持等待狀態4小時。這將發生在多線程環境中,其中幾個Java線程將調用多個shell腳本,每個腳本耗費3個多小時。 (雖然線程數量很小)

說實話,我認爲你要解決的問題在很大程度上是虛構的。

等待4小時無所事事的單線程的成本接下來沒有。這是使用(通常)1Mb非堆空間來表示堆棧的代價。如果這些線程的數量會很小,那麼總空間是少量的兆字節。除非你在內存受限的系統上運行,否則它甚至不值得擔心。 (可以稱之爲「不可取」 ... IMO)。

如果你的內存約束,那麼首先要嘗試的是分配具有減小堆棧大小的線程;例如使用this constructor。我認爲10Kb的線程堆棧就足以完成這項任務。