2012-05-02 61 views
0

我正在編寫一個模塊,其中將生成執行某個任務的多個線程。所以總的來說,我有一個'經理'類,它提供信息給'Resolver'類,它使用線程池創建並提交'任務'。在隊列中查找已生成的任務的策略

解析器具有有我使用的檢查,如果perticular任務已經產生了無限的隊列中的線程池執行。如果隊列中已有任務實例,則使用ThreadPoolExecutor將其刪除並再次提交新任務。這是有意完成的,因爲新任務會從「經理」中帶來新的信息。

我使用的ThreadPoolExecutor發現如果任務已經是隊列。但是我擔心隊列的性能,並且認爲哈希映射將是更好的選擇,因爲隊列可能有超過30000個任務實例。

引導我選擇在隊列中找到已經催生了任務的適當策略。

+0

而不是尋找您可以使用任務'Future.cancel(假)'將停止工作,如果它尚未啓動。 –

回答

0

我不認爲它會引起任何問題(除非你實現過於複雜等於實現)。我會建議運行一個測試與分析器,並看看,如果它是一個真正的問題或不...

然而,如果是,你可能會創建自己的BlockingQueue的實現(它可能會傳遞到ThreadPollExecutor作爲構造參數)。這樣你可以創建一些混合的BlockingQueue(用於標準工作隊列)和HashSet(用於fast包含(...)測試)的一些實現。記住這些集合上所有操作的正確同步。所有操作必須是原子的。

+0

謝謝。我將使用BlockingQueue並調用remove來移除任何未決任務。當你說所有的操作都是原子操作時,你是否建議我使用同步方法使其成爲原子?或者其他更好的選擇? – user832096

+0

如果你沒有用你自己的實現封裝類,你不需要擔心同步。 – MikePatel

+0

是的,我會建議同步所有方法。或者,您可以使用Lock(http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/locks/Lock.html)。 – altanis