寻找Java聪明的任务调度程序和执行程序

时间:2012-03-07 23:28:49

标签: java multithreading thread-safety scheduled-tasks scheduling

我正在寻找一个具有特定功能集的Java任务调度程序,然后我自己偶然发现它。

这不是一个调度程序,而是一个逻辑门,它确定一组( T )中的哪些任务现在可以执行(例如传递给ThreadPoolExecutor)以及哪些任务必须等待一些未来的条件。

这是我想要实现的示例:考虑可能与每个任务相关联的各种属性:

  • Foo:Foo任务一次只能执行一次,因此 T.foo2 无法启动,直到 T.foo1 完成,无论那里有多少执行能力是
  • Bar:Bar任务没有并发限制,因此调度程序可以谨慎对待风,并将 T.bar1 通过 T.barN 直接引入执行队列。
  • 如果任务被标记为具有属性 Foo ,则 Foo 属性将优先关于安排。

简单,对吧?

任何人都知道这样的框架吗?

谢谢!

//尼古拉斯

3 个答案:

答案 0 :(得分:3)

在我看来,您想要使用单独的执行程序。您可以newFixedThreadPool(1) Foo,然后Bar使用newCachedThreadPool(),如果您真的想让它成为无限的线程。

然后你会有一些包装器对象,所以你可以submit(Foo foo)submit(Bar bar)submit(Object obj)来测试FooBar并提交给它正确的执行人。类似的东西:

public class FooBarExecutor {
    private ExecutorService fooExecutor = Executors.newFixedThreadPool(1000);
    private ExecutorService barExecutor = Executors.newCachedThreadPool();

    public <T> Future<T> submit(Foo foo) {
        return fooExecutor.submit(foo);
    }

    public <T> Future<T> submit(Bar bar) {
        return barExecutor.submit(bar);
    }

    public <T> Future<T> submit(Object obj) {
        if (obj instanceof Foo) {
            return submit((Foo)obj);
        } else if (obj instanceof Bar) {
            return submit((Bar)obj);
        } else {
           throw new IllegalArgumentException(
              "Object should be either Foo or Bar");
        }
    }
}

这假设FooBar都实现RunnableCallable。我也怀疑我是否正确使用了仿制药,但你明白了。

答案 1 :(得分:1)

我不确定这对你的案例是否有点过分,但 Java应用程序的任务调度程序是Quartz。值得一看。

答案 2 :(得分:1)

Quartz确实有扩展点,这可能有助于在作业处理上做出这些决定。看看:

public boolean vetoJobExecution(Trigger trigger, JobExecutionContext context)

特别是

相关问题