15

我的问题是,Java 中是否存在用于管理和并发运行具有逻辑依赖关系的任务的框架。

我的任务如下:我有很多独立的任务(比如说 A、B、C、D ...),它们被实现为命令(就像在命令模式中一样)。我想要一种执行器,它将接受所有这些任务并以并行方式执行它们。任务可以相互依赖(例如,我不能运行 C,在运行 A 之前)、同步或异步。

我还想结合自定义启发式方法来影响调度程序的执行,例如,如果任务 A 和 B 是 CPU 密集型的,并且 C 具有很高的内存消耗,那么并行运行 A 和 C 是有意义的,而不是运行 A 和 B。

在我自己开始构建这些东西之前(我正在考虑基于 java.util.concurrent + 注释的约束/规则),我想知道是否有人可以向我指出一些可以满足我需求的项目。非常感谢提前

4

4 回答 4

7

我认为没有一个可以满足您要求的管理任务的框架。使用命令模式,您走在正确的道路上。您可以查看Akka 框架以了解简化的并发模型。Akka 基于 Actor 模型:

Actor 模型是另一个非常简单的高级并发模型:Actor 一次不能响应多个消息(消息排队到邮箱中)并且只能通过发送消息进行通信,不能共享变量。只要消息是不可变的数据结构(在 Erlang 中总是如此,但必须是语言中的约定,而无法确保此属性),一切都是线程安全的,不需要任何其他机制。这与 Web 开发 MVC 框架中的请求周期非常相似。 http://metaphysicaldeveloper.wordpress.com/2010/12/16/high-level-concurrency-with-jruby-and-akka-actors/

Akka 是用 Scala 编写的,但它公开了干净的 Java API。

于 2011-02-06T10:03:47.510 回答
2

我建议您检查ant用于此目的的可能性。虽然ant被称为流行的构建工具,但它实际上是运行各种任务的 XML 控制引擎。我认为它的标志fork=true完全符合您的需要:同时运行任务。因为任何 java 应用程序ant都可以从其他 java 应用程序执行:只需调用它的main方法。在这种情况下,您可以使用 ant API 包装您的任务,即将它们实现为 Ant 任务。

我从未尝试过这种方法,但我相信它应该有效。几年前我考虑过,并建议我的管理层作为解决与您类似的问题的可能解决方案。

于 2011-02-06T10:10:40.770 回答
0

Eclipse's job scheduling module is able to handle interdependent tasks. Take a look at http://www.eclipse.org/articles/Article-Concurrency/jobs-api.html.

于 2011-02-11T16:17:57.473 回答
0

有一个专门用于此目的的框架,称为dexecutor(免责声明:我是所有者)

Dexecutor 是一个非常轻量级的框架,以可靠的方式执行依赖/独立任务,为此它提供了最小的 API。

  • 一个在图中添加节点的API(addDependency, addIndependent, addAsDependentOnAllLeafNodes, addAsDependencyToAllInitialNodes 后面两个是前面两个的混合版本)
  • 另一个按顺序执行节点。

这是最简单的例子:

DefaultDependentTasksExecutor<Integer, Integer> executor = newTaskExecutor();

executor.addDependency(1, 2);
executor.addDependency(1, 2);
executor.addDependency(1, 3);
executor.addDependency(3, 4);
executor.addDependency(3, 5);
executor.addDependency(3, 6);
//executor.addDependency(10, 2); // cycle
executor.addDependency(2, 7);
executor.addDependency(2, 9);
executor.addDependency(2, 8);
executor.addDependency(9, 10);
executor.addDependency(12, 13);
executor.addDependency(13, 4);
executor.addDependency(13, 14);
executor.addIndependent(11);

executor.execute(ExecutionBehavior.RETRY_ONCE_TERMINATING);

以下是如何构建依赖图 在此处输入图像描述

任务 1、12、11 将并行运行,一旦这些任务完成,相关任务将运行,例如,假设任务 1 完成,任务 2 和 3 将类似地运行,一旦任务 12 完成,任务 13 将运行等等.

于 2016-08-25T15:06:49.917 回答