【问题标题】:How long does the JVM wait for a threadJVM 等待一个线程多长时间
【发布时间】:2014-04-06 23:07:55
【问题描述】:

各位 JAVA 开发人员您好, 我有一个关于 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 还在等吗?

【问题讨论】:

  • 是的,我相信是的。它应该永远运行。

标签: java jvm


【解决方案1】:

waitFor 方法使当前线程在必要时等待,直到此 Process 对象表示的进程终止。如果子进程已经终止,则此方法立即返回。如果子进程尚未终止,调用线程将被阻塞,直到子进程退出。(来自Javadoc)。

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

【讨论】:

    【解决方案2】:

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

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

    1. 根据 waitFor 方法的 javadoc 如果当前线程被另一个线程中断,而它正在 等待,然后等待结束并抛出 InterruptedException

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-10-04
        • 1970-01-01
        • 2011-07-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-13
        相关资源
        最近更新 更多