【问题标题】:Is calling external programs from Java the same as threading?从 Java 调用外部程序是否与线程相同?
【发布时间】:2014-08-12 17:36:48
【问题描述】:

我刚刚开始使用 Java 执行批处理程序。我试图让转换器程序轮询一个目录,以便文件将由 ffmpeg 自动转换并发送到输出目录。我写了一些类似的东西......

    Process p = Runtime.getRuntime().exec("ffmpeg args args args args....");
    p.waitFor();

这就是我将如何处理线程

    Thread threadThlinstone = new Thread(new Runnable()
    {
        @Override
        public void run()
        {
            // Do thing!
        }
    }).start();
    threadThlinstone.join();

除了创建一个新的 JVM 来执行任务,并且 JVM 的实例可以共享内存之外,这两个代码示例之间有什么根本不同吗?

【问题讨论】:

标签: java multithreading join command-line process


【解决方案1】:

第一个创建一个新进程。不过,它不一定是新的 JVM。除非您正在运行另一个 Java 程序,否则您不会获得另一个 JVM。在您的示例中,您正在调用 ffmpeg,它是本机二进制文件,因此它不会在 JVM 中运行。

第二个启动一个新线程,这是您现有程序的一部分。这意味着它与主程序共享内存。这也意味着如果您的主程序终止,线程也将终止(在您的第一个示例中不是这样)。

第二种是一种更高效的工作方式,因为调用外部程序的任务相当繁重,而且还会导致更多潜在的安全问题。如果你可以在Java环境中做你想做的事,那么第二种方法更好。

但就目前而言,第二个基本上毫无意义。你开始一个新线程,让它做一些事情,然后等待它完成。如果你这样做,你也可以在不创建新线程的情况下完成这项工作。创建新线程的唯一原因是它可以在后台执行操作,而无需等待它完成。

【讨论】:

  • "这也意味着如果你的主程序终止,线程也会终止。"不正确,因为第二个线程是常规线程(即,不是守护线程)。只要至少有一个非守护程序仍在运行,JVM 就会继续运行。主线程是否是其中之一并不重要。
  • 好吧,那我想这只是一个例子很好! xD。我通常使用 ExecutorService 启动多个线程并等待它们完成,但我使用此示例是为了论证。那么,这是否意味着操作系统具有对线程是什么的内置理解?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-22
  • 2016-05-29
  • 2013-08-14
  • 1970-01-01
  • 1970-01-01
  • 2020-11-28
相关资源
最近更新 更多