用于管理任务的Java Framework

时间:2011-02-06 09:44:51

标签: java multithreading frameworks concurrent-programming

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

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

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

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

4 个答案:

答案 0 :(得分:7)

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

  

演员模型是另一个非常简单的   高级并发模型:演员   无法回复多条消息   一次(消息排队进入   邮箱)并且只能通过   发送消息,而不是共享   变量。只要消息是   不可变数据结构(即   在Erlang中总是如此,但必须是一个   没有手段的语言惯例   保证这个属性),一切   是线程安全的,不需要任何   其他机制。这非常相似   请求在网络中找到的周期   开发MVC框架。   http://metaphysicaldeveloper.wordpress.com/2010/12/16/high-level-concurrency-with-jruby-and-akka-actors/

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

Eclipse的作业调度模块能够处理相互依赖的任务。看看http://www.eclipse.org/articles/Article-Concurrency/jobs-api.html

答案 3 :(得分: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);

以下是如何构建依赖图 enter image description here

任务1,12,11将并行运行,一旦完成这些任务就完成了相关任务的运行,例如,让任务1完成,任务2和3将在任务12完成后运行,完成任务13将运行等等。