多:线程 - 这是正确的方法吗?

时间:2010-03-26 15:22:23

标签: java multithreading concurrency

专家 -

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

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

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

这是正确的做法吗?有没有其他更好的方法使用Java 1.5功能?

5 个答案:

答案 0 :(得分:5)

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

以下是一个说明此问题的示例 http://www.javaconcurrencyinpractice.com/listings/ThreadDeadlock.java

另外,如果您有例如汇集数据库连接,您也可能遇到问题。 10个线程可以阻塞,保持所有池连接,等待第11个线程无法获取第11个池连接,因为没有更多可用..

答案 1 :(得分:3)

您所描述的 Java5 / 6方法。

确保您的任务/ Callables线程安全/不共享状态。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

不要重新发明这一点。只需使用Ant。

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

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

Ant了解并行任务。您不需要做任何事情,只需将任务声明为并行。 http://ant.apache.org/manual/Tasks/parallel.html

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

答案 4 :(得分:1)

实际上,当启动多个流程的成本很高时,需要多线程。

坦率地说,几乎任何能够驱动JVM副本的东西。

要回答OP,ANT能够并行运行任务,而不是并行运行目标。因此,即使您有一个build.xml文件,您希望将其更改为并行运行,您也必须进行重大的重写。 (我认为这是由ANT开发人员做出的一个相当奇怪的设计决策,因为你已经得到了目标本身所描述的依赖图。)