2011-06-22 9 views

答えて

1

@virsirは、

あなたは、インスタンスThreadPoolExecutorを作成する方法について、具体的尋ねたのです。しかし、私はExecutorServiceインターフェイスを実装する任意のクラスを持つことが大丈夫だろうと思っています。 ThreadPoolExecutorExecutorServiceを実装しているので、これは大きな飛躍ではありません。

java.util.concurrent.Executorsクラスは、いくつかの一般的な状況を処理するスレッドプールを作成するための便利な機能を提供します。

私は最近、いくつかの異なるスレッドプールを作成するプロジェクトでExecutors.newFixedThreadPool()を使用しました。 ExecutorServiceを実装するオブジェクトを返します。私は何万ものRunnableインスタンスを10スレッドのプールに提出するのに問題はなく、非常にスムーズに動作しました。 Java 5のドキュメント当たり

、この方法は:

は 共有アンバウンド形式のキューなしで動作するスレッドの 固定セットを再利用するスレッドプールを作成します。シャットダウンの前に の実行中にエラーが発生して終了したスレッド がある場合は、 の新しいスレッドが必要になった場合は、 を実行して以降のタスクを実行します。

このメソッドは「無制限のキュー」を作成すると言われているため、送信できるタスクの数に人為的な制限はないはずです。

+0

確かにExecutors.newFixedThreadPool()の+1です。うまく動作します – MJB

+0

これは素晴らしいですが、もし私が並べ替えるためにキューを必要とする?ジョブの優先順位に基づいてジョブを並べ替える必要があるからです。 –

+1

@MuhammadGelbana、それはもっと複雑な答えでやや異なる質問です。 [この回答](http://stackoverflow.com/questions/3198660/java-executors-how-can-i-set-task-priority)を参照するか、Webで「Java executor priority queue」を検索してください。 – GargantuChet

1

キューはジョブを削除しません。特定の時点で実行されるスレッドの数は限られています。残りのジョブは、他のスレッドが終了するときに次の使用可能なスレッドを取得するまでキューされます。

ジョブの実行順序は、使用しているキューによって異なります。プライオリティキュー、FIFOキューのetc ...

+1

境界キュー( 'ArrayBlockingQueue'またはバウンド' LinkedBlockingQueue')を使用すると、タスクをサブミットすると、デフォルトの拒否ハンドラによって 'RejectedExecutionException'がスローされる可能性があります。これは、スレッドの最大数がすでに作成されていて、すべてが満杯だった場合に発生します。 'DiscardPolicy'や' DiscardOldestPolicy'が拒否ハンドラとして使われた場合、明らかに投稿が失われる可能性があります。しかし、一般的に、API開発者は、デフォルトの応答が静かに仕事を失うことではないことを確認しようとしたように見えます。 – GargantuChet

関連する問題