2011-06-28 22 views
2

我有一個問題,一直在推動我瘋了一段時間,我需要諮詢你的集體智慧。RejectedExecutionException即使當ExecutorService由isShutdown()保護時()

我有一個ThreadPoolExecutor,其池的值爲1,從Executors.newFixedThreadPool調用。我使用!isShutdown()來保護所有executor.execute(),因爲executor.shutdown()是從另一個線程調用的,所以應該能夠說執行程序不會拋出RejectedExecutionException。不過,這是我隨機看到的。

有沒有人有一個好主意,爲什麼我看到這種行爲?

回答

0

還有其他原因拒絕執行被闡明這裏http://download.oracle.com/javase/1,5.0/docs/api/java/util/concurrent/ThreadPoolExecutor.html

最有可能您的隊列達到了它的邊界。

+0

從javadocs,newFixedThreadPool創建一個線程池,它重用固定數量的線程,在共享的無界隊列中運行,因此它永遠不會有這個問題。 – Hwee

+0

我的不好。我錯過了你使用固定線程池。我能想到的其他事情是當線程池在檢查之後但在任務提交之前被標記爲關閉時的一些併發問題。可能你可以同步? –

+0

這似乎是唯一的解釋,不是嗎?感謝您的建議:) – Hwee

0

您可能會閱讀關於double-checked locking的文章,以瞭解未同步的「if then act」方法在java中的工作方式/原因。

出於好奇,爲什麼你打擾檢查工作是否會被拒絕?我不記得以前看過這個。相反,爲什麼不捕獲和處理拋出的任何RejectedExecutionException?

還要小心如何處理其他錯誤條件,尤其是在調用關閉時正在隊列中運行或正在等待的任務。 Java併發實踐的第7章有很多關於此的良好信息。

+0

我實際上沒有檢查過,直到我開始得到RejectedExecutionExceptions。我已經改變了我的代碼來簡單地捕捉異常現在,謝謝。另外,我已經意識到我有Java實踐中的併發實踐書,現在是我再次閱讀它的時候了。 – Hwee