专家 -
在以下情况中我需要一些建议。
我有一个包含任务列表的配置文件。每个任务可以具有零个,一个或多个依赖项。我想并行执行这些任务[现在它们正在顺序执行]
我们的想法是让主程序读取配置文件并加载所有任务。读取单个任务并将其提供给执行任务[callable],执行任务并返回Future中的结果。当任务提交给执行程序(线程)时,它将监视其依赖关系,以便先完成并执行自己的任务。
这是正确的做法吗?有没有其他更好的方法使用Java 1.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开发人员做出的一个相当奇怪的设计决策,因为你已经得到了目标本身所描述的依赖图。)