對我來說,你想使用單獨的執行者。如果你真的想使它成爲無限的線程,你可以使用newFixedThreadPool(1)
作爲Foo
,然後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
。我也懷疑我是否正確使用了泛型,但是您明白了。
嘿,快速響應灰色!我喜歡指定爲屬性併發配置的池。然而,我發明的屬性是任意的,所以在我的想象中,框架將提供一種聲明性地定義每個命名屬性約束條件的方法。然而,在封面之下,它可能會完全按照您在動態調整所需構造之後列出的內容。 – Nicholas 2012-03-07 23:37:36
@尼古拉斯是的,這很難。你可以讓'Foo'和'Bar'實現某種'createExectuorForMe()'接口方法,然後你可以將類的併發映射保留爲'ExecutorService',但這可能太複雜了。當你提交一個對象時,它會查找這個類,如果沒有執行器,它會在對象或某個對象上調用'createExectuorForMe()'方法。 – Gray 2012-03-07 23:42:47