2013-02-11 44 views
1

隊列我有一個ThreadPoolExecutor是滿足我DownloadTask implements Runnable{private String taskId...任務,我必須隨時可能獲得來自ThreadPoolExecutor隊列中定義的任務,例如,使用任務ID:如何移動Java中

mDownloadTasksPool.getQueue(); 

什麼是travesre隊列和獲得定義元素的最佳方式是什麼?

它可能有一個列表與所有重複的任務,但它看起來不是很優雅。

回答

1

將您的Runnables子類化以提供taskID的getter(如果這是您的密鑰)。創建一個併發映射,將您的taskID映射到您放入隊列中的Runnable。子類ThreadPoolExecutor。在beforeExecute中,您從當前任務中刪除當前任務,因爲它不在隊列中了。您可能想將Runnable轉換爲您的自定義類以使用該taskID getter。

+0

我不想使用單獨的集合對象,我只想使用它的BlockingQueue使用ThreadPoolExecutor。 – pvllnspk 2013-02-11 15:25:42

+0

好吧,在這種情況下,每當你想找到一個任務時,你將不得不遍歷整個隊列。該隊列也將被TPE使用,但幸運的是,LinkedlockingQueue和ArrayBlockingQueue的迭代器是弱一致的,並且不會拋出ConcurrentModificationException。 – 2013-02-11 15:40:39

+0

'ThreadPoolExecutor'本身沒有_it's_'BlockingQueue'。你必須在構造函數中提供你自己的隊列。大多數'Executors'提供的多線程TPE使用LinkedBlockingQueues。 – 2013-02-11 15:46:20