2011-06-28 4 views
2

私はしばらくの間ナットを運転している問題を抱えており、あなたの集団知恵に相談する必要があります。RejectedExecutionExceptionでも、ExecutorServiceがisShutdown()によって保護されている場合でも、

私は、Executors.newFixedThreadPoolから呼び出された1のプールを持つThreadPoolExecutorを持っています。 executor.shutdown()は別のスレッドから呼び出されているので、executor.execute()は!isShutdown()でガードされているので、エグゼキュータが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でどのように動作しないのかを理解することができます。

好奇心の高まりから、作品が拒否されるかどうかを確認するのはなぜ難しいですか?私は前にこれを見るのを覚えていない。代わりに、スローされたRejectedExecutionExceptionsをキャッチして処理しないでください。

他のエラー状態、特にシャットダウンが呼び出されたときにキュー内で実行中または待機中のタスクを処理する方法にも注意してください。 Java Concurrency in Practiceの第7章には、これに関する多くの良い情報があります。

+0

RejectedExecutionExceptionsを取得するまで、私は実際に前にチェックをしていませんでした。私は今、単に例外をキャッチするために私のコードを変更しました、ありがとう。さて、私は、Java Concurrency in Practiceの本を持っていることに気付きました。 – Hwee

関連する問題