2012-08-01 12 views
5

我有一個單線程池ExecutorService對象。在將來的某個時候,使用submit()方法添加任務。我的理解是提交將提交將提交的Runnable添加到要完成的任務列表的末尾。不過,我有一種基於布爾值的情況,我可能想要將可運行程序提交到要執行的任務的前面。我不希望這會影響當前的任務,只是下一個任務將成爲我剛剛完成的任務。一個示例方法如下所示。我該怎麼做呢?Java插入可運行對象到ExecutorService中

感謝

private ExecutorService singleLoadPool = Executors.newSingleThreadExecutor(); 
public void submitTask(Runnable run, boolean doNow) { 
    if (doNow) 
     singleLoadPool.submitFront(run); // This is the method I'm looking for 
    else 
     singleLoadPool.submit(run); 
} 

回答

4

我更傾向於將使用LinkedBlockingDeque。它直接支持定位插入/刪除 - putFirst(e)/takeFirst()putLast(e)/takeLast() - 這是您的主要要求 - 您不必爲您的元素實施Comparator。此外,這是有限的 - 這意味着它提供了安全性對OutOfMemoryError

編輯迴應最新的問題:

首先,有一個像

ExecutorService executorService = new ThreadPoolExecutor(1, 1, 1, TimeUnit.SECONDS, workQueue);

其次,重要的問題是ExecutorService的:什麼是workQueue

workQueue是一個瘦包裝過任何BlockingQueue實現,它包含了代表所有的方法到LinkedBlockingDeque實例,除了offer()方法,它是由ThreadPoolExecutor呼籲,並需要被重寫,像這樣的:

 public boolean offer(E e) { 
     if(doNow) 
     return linkedBlockingDequeInstance.offerFirst(e); 
     else 
     return linkedBlockingDequeInstance.offerLast(e); 
    } 

Ofcourse,當你重寫任何方法 - 你需要注意保護線程安全及其一般contract.Definitely這需要認真思考和嚴格的測試。

+0

這正是我所需要的,謝謝 – Jon 2012-08-01 20:38:10

+0

比我的解決方案更好:) – 2012-08-01 20:43:48

+0

所以我只是要實現這個,並且還有一個問題,我如何將作業添加到隊列中?我是否必須重寫ThreadPoolExecutor,因爲我不能將Runnable對象添加到LinkedBlockingDeque中? – Jon 2012-08-02 21:41:37

1

我覺得這個你最好的辦法是instantiate a ThreadPoolExecutorPriorityBlockingQueue。具體來說,使用一個PriorityBlockingQueue構造函數,它接受Comparator。您的Comparator將用於實現您的「優先級」。

PriorityBlockingQueue<Runnable> workQueue = new PriorityBlockingQueue<Runnable>(20, yourPriorityComparator); 
ExecutorService executorService = new ThreadPoolExecutor(1, 1, 1, TimeUnit.SECONDS, workQueue); 
+0

感謝您的迴應,您能提供一個priorityComparator的例子嗎? – Jon 2012-08-01 20:17:21

+0

看看比較器接口(現在鏈接在答案中)。您可能需要實現自己的「比較器」,但它應該相對簡單。 – 2012-08-01 20:24:09

+0

我的問題是,我不明白如何讓我的布爾值進入比較器。爲了編譯我需要用以下簽名私有類RunnableComparator實現比較器。比較器需要比較Runnable類型,並且無法比較實現Runnable的類,並且在ExecutorService可以實例化之前只能有1個需要實例化的Comparator,所以doNow布爾值不能傳遞給它。 – Jon 2012-08-01 20:31:32