1

我正在尋找一個Java任務調度器,它有一個特定的功能集之前我偶然發現它自己。尋找Java聰明的任務調度器和執行器

這與其說是一個調度器,但一個邏輯門,用於確定在一組(Ť),其任務現在被執行(例如,通過關斷至一個的ThreadPoolExecutor)和哪些任務必須等待將來的某個狀態。

這是我想實現什麼樣的例子:考慮可能與每個任務相關聯的各種屬性:

  • 富:富任務只能執行一次一個,所以T. foo2無法啓動,直到T.foo1已完成,無論有多少執行能力。
  • 酒吧:酒吧的任務沒有併發限制,因此調度程序能夠通過T.barN扔謹慎的風和爆炸T.bar1直接進入執行隊列。
  • 如果任務被標記爲具有屬性美孚酒吧,則美孚屬性將優先相對於調度。

很簡單吧?

任何人都知道這樣的框架?

謝謝!

//尼古拉斯

回答

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。我也懷疑我是否正確使用了泛型,但是您明白了。

+0

嘿,快速響應灰色!我喜歡指定爲屬性併發配置的池。然而,我發明的屬性是任意的,所以在我的想象中,框架將提供一種聲明性地定義每個命名屬性約束條件的方法。然而,在封面之下,它可能會完全按照您在動態調整所需構造之後列出的內容。 – Nicholas 2012-03-07 23:37:36

+0

@尼古拉斯是的,這很難。你可以讓'Foo'和'Bar'實現某種'createExectuorForMe()'接口方法,然後你可以將類的併發映射保留爲'ExecutorService',但這可能太複雜了。當你提交一個對象時,它會查找這個類,如果沒有執行器,它會在對象或某個對象上調用'createExectuorForMe()'方法。 – Gray 2012-03-07 23:42:47

1

我不確定這是否會對您的情況有所幫助,但 Java應用程序的任務調度程序是Quartz。值得一看。

+0

謝謝奧斯卡獎。我想過Quartz,但我不記得它具有這種功能。雖然已經有一段時間了。我會回去看看最新的。謝謝。 – Nicholas 2012-03-07 23:39:40

1

Quartz確實有擴展點,這可能有助於在作業處理中做出這些決定。請看:

public boolean vetoJobExecution(Trigger trigger, JobExecutionContext context)

特別