Java JVM等待线程多长时间

Java JVM等待线程多长时间,java,jvm,Java,Jvm,大家好,各位JAVA开发人员, 我有一个关于JVM的简单问题,我想知道JVM将等待线程多长时间? 例如,请查看以下代码: public static void main(String[] args) { p = Runtime.getRuntime().exec("myShellCommand -p1 v1 -p2 v2"); p.waitFor(); System.out.println("End ....:)"); } 假设“myshell命令”永远运行,那么会发生什么?JVM还一直

大家好,各位JAVA开发人员, 我有一个关于JVM的简单问题,我想知道JVM将等待线程多长时间? 例如,请查看以下代码:

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

假设“myshell命令”永远运行,那么会发生什么?JVM还一直在等待吗?

如果需要,waitFor方法会导致当前线程等待,直到该进程对象表示的进程终止。如果子流程已终止,则此方法立即返回。如果子进程尚未终止,则调用线程将被阻止,直到子进程退出(从)


根据文档,我认为它将永远运行。

在您的情况下,JVM将继续等待启动的进程终止

但是,您可以启动另一个“进程监视器”线程,该线程可以等待/休眠一段合理的时间,然后中断主线程

  • 根据waitFor方法的javadoc 如果当前线程在运行时被另一个线程中断 等待,然后等待结束并抛出中断异常
  • @考塔

    如果您的要求是启动流程,然后在合理的时间段(例如10分钟)后退出JVM,那么您可以执行以下操作:

    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);
    
    }
    

    是的,我想是的。它应该永远运行。