2014-04-06 37 views
1

嗨每個JAVA開發者, 我有一個關於JVM的簡單問題,我想知道JVM等待一個線程多長時間? 例如,看看下面的代碼:JVM等待一個線程多長時間

public static void main(String[] args) { 
p = Runtime.getRuntime().exec("myShellCommand -p1 v1 -p2 v2"); 
p.waitFor(); 
System.out.println("End ....:)"); 
} 

假設「myShellCommand」永遠跑,什麼怎樣呢? JVM還在等待着嗎?

+1

是的,我相信是的。它應該永遠運行。 – Jason

回答

1

如果需要,waitFor方法會導致當前線程等待,直到由此Process對象表示的進程終止。如果子進程已經終止,則此方法立即返回。如果子進程尚未終止,則調用線程將被阻塞,直到子進程退出(來自Javadoc)。

基於文檔,我認爲它會永遠運行。

0

就你而言,JVM將繼續等待啓動的進程終止。

但是,您可以啓動另一個「進程監視器」線程,並且可以等待/休眠一段合理的時間,然後中斷主線程

  1. 作爲每WAITFOR方法 的的Javadoc如果當前線程被另一個線程中斷而它是 等待,然後等待結束,並且一個InterruptedException的被拋出。
0

@Kaoutar

如果你的要求是啓動過程,然後在合理的時間後退出JVM,例如10分鐘,那麼你可以這樣做:

public static void main(String[] args) 
{ 
Thread subProcessThread = new Thread(new Runnable() 
          { 
           @Override 
           public void run() 
           { 
            Process p; 
            try 
            { 
            p = Runtime.getRuntime().exec("myShellCommand -p1 v1 -p2 v2"); 
            p.waitFor(); 
            System.out.println("End ....:)"); 
            } 
            catch (IOException e) 
            { 
            e.printStackTrace(); 
            } 
            catch (InterruptedException e) 
            { 
            e.printStackTrace(); 
            } 
           } 
          }); 
subProcessThread.start(); 
long waitTimeInMillis = 10 * 60 * 1000; 
subProcessThread.join(waitTimeInMillis); 

}