【问题标题】:Multi:Threading - Is this the right approach?Multi:Threading - 这是正确的方法吗?
【发布时间】:2010-03-26 15:22:22
【问题描述】:

专家 -

在以下情况下我需要一些建议。

我有一个包含任务列表的配置文件。每个任务可以有零个、一个或多个依赖项。我想并行执行这些任务[现在它们正在按顺序执行]

这个想法是有一个主程序来读取配置文件并加载所有任务。读取单个任务并将其提供给执行器 [callable],该执行器将执行任务并在 Future 中返回结果。当任务提交给执行器(线程)时,它将监视其依赖项以首先完成并执行自己的任务。

这是正确的方法吗?使用 java 1.5 特性还有其他更好的方法吗?

【问题讨论】:

  • 您是在重新发明antmaven 实用程序吗?你为什么不简单地为此定义Ant 任务?
  • S.Lott ~ 这与 ant 或 maven 脚本和任务执行有关。我上面提到的任务与数据库活动、归档、规则处理等[可以任意组合!]

标签: java multithreading concurrency


【解决方案1】:

听起来不错,但要小心Thread starvation deadlock。基本上,不要使用有界线程池。

这里有一个例子来说明这个问题。
http://www.javaconcurrencyinpractice.com/listings/ThreadDeadlock.java

另外,如果您有一个池化的数据库连接,你也可能会遇到问题。 10个线程可以阻塞,持有所有池连接,等待第11个线程无法获取第11个池连接,因为不再可用..

【讨论】:

  • +1。这种问题在 SO 上很常见,有人总是建议“一次提交所有任务”的解决方案而没有提到这种风险。
  • 我认为 ThreadDeadlock.java 的另一个教训是“小心提交更多任务的任务”。在某些环境中,您希望在线程池上设置一个最大界限。
  • 我猜,我开始遇到问题了。我该如何解决?
  • @HonorGod:嗯,您需要向我们展示代码/描述您面临的问题。我建议您打开一个新问题。
【解决方案2】:

您所描述的 Java5/6 方法。

只需确保您的任务/可调用对象是线程安全的/不共享状态。

【讨论】:

    【解决方案3】:

    考虑使用ValueFuture(来自guava)在任务之间进行通信。为每个ValueFuture 添加一个侦听器,仅当其所有输入都可用时,它才会向ExecutorService 提交一个新任务。这样一来,您将永远不会在等待另一个任务完成的任务中出现线程阻塞。

    【讨论】:

    • 嘿,这似乎是个好主意! +1
    【解决方案4】:

    数据库活动、归档和规则处理是 Ant(甚至是 Maven)的完美用途

    不要重新发明它。只需使用 Ant。

    为每个任务编写 Ant 任务。使用 Ant 的依赖规则在 XML 中定义依赖关系。

    松开 Ant 以根据依赖项运行您的任务。您可以从“可执行”Ant Tasks (http://ant.apache.org/manual/tasksoverview.html#exec) 开始,而不是定义您自己的 Task 子类。

    Ant 理解并行任务。您无需执行任何操作,只需将任务声明为并行。 http://ant.apache.org/manual/Tasks/parallel.html

    不要为此发明任何新软件。使用蚂蚁。

    【讨论】:

    • 你能在java应用程序中嵌入ant吗?
    • 我只知道它是一个构建工具。不过我看了一下手册。所以想必您可以将 ant.jar 作为依赖项添加到您的项目中,并以编程方式调用描述任务的 ant 脚本?
    • 这就是 ant 的重点——通过执行任务来解决依赖关系。这是唯一的意义。编译和创建 JAR 文件是这种处理最常见的应用。但是任何涉及处理和依赖的事情都可以由Ant优雅地处理。
    • 我知道 ANT 的一般用法...通过解决依赖关系来构建[我最常使用的]!我特别要求多线程...... ANT 也支持这个吗?
    • 你不想要多线程。您需要多个外部任务,如下所述:ant.apache.org/manual/CoreTasks/parallel.html。仅当您的问题涉及大量共享状态时,多线程才适用。您对独立任务的描述未提及共享状态;多线程不会有任何好处。使用多个外部流程,事情会变得 (a) 快速和 (b) 简单。
    【解决方案5】:

    实际上,当启动多个进程的成本很高时,您确实想要多线程。

    坦率地说,这几乎是任何构建 JVM 副本的东西。

    为了回答 OP,ANT 能够并行运行任务,但不能并行运行目标。因此,即使您确实有一个想要更改为并行运行的 build.xml 文件,您也必须进行可能的重大重写。 (我认为这是 ANT 开发人员做出的一个相当奇怪的设计决定,因为您已经获得了目标本身描述的依赖关系图。)

    【讨论】:

      猜你喜欢
      • 2013-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-11
      • 2012-05-11
      • 2020-06-27
      • 2020-01-17
      • 2018-01-31
      相关资源
      最近更新 更多