<分区>
在我自己偶然开发它之前,我正在寻找具有特定功能集的 Java 任务调度程序。
与其说它是一个调度程序,不如说它是一个逻辑门,它决定一组 (T) 中的哪些任务现在可以执行(例如传递给 ThreadPoolExecutor)以及哪些任务必须等待一些 future 的条件。
这是我想要实现的示例:考虑可能与每个任务关联的各种属性:
- Foo:Foo 任务一次只能执行一个任务,因此 T.foo2 在 T.foo1 完成之前无法启动,无论那里的执行能力有多大是。
- Bar:Bar 任务没有并发限制,因此调度程序可以抛开警告,将 T.bar1 到 T.barN 直接放入执行队列。
- 如果任务被标记为具有属性 Foo 和 Bar,则 Foo 属性将优先关于日程安排。
很简单,对吧?
有人知道这样的框架吗?
谢谢!
//尼古拉斯
在我看来,您想使用单独的执行程序。您可以为 Foo
使用 newFixedThreadPool(1)
,然后如果您真的想要,Bar
将使用 newCachedThreadPool()
使其成为无限线程。
然后您将拥有一些包装器对象,这样您就可以submit(Foo foo)
、submit(Bar bar)
或submit(Object obj)
将测试 Foo
或 Bar
并将其提交给正确的执行程序。像这样的东西:
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");
}
}
}
这假设 Foo
和 Bar
都实现了 Runnable
或 Callable
。我也怀疑我是否正确使用了泛型,但你明白了。