JavaのExecutors
フレームワークを使用してマルチスレッドアプリケーション用のスレッドプールを作成しています。Executorsサービスを使用してJavaで固定サイズのスレッドプールを作成する最適な方法
私は、リアルタイムまたは非リアルタイムモードで動作するアプリケーションを持っています。場合には、それはリアルタイムだ、私は単純に次のように使用しています:
THREAD_POOL = Executors.newCachedThreadPool();
しかし、それは、リアルタイムいない場合には、私は私のスレッドプールのサイズを制御する機能が欲しいです。 これを行うには、私は2つのオプションについて考えていますが、私は実際にその違いを理解しておらず、どちらが良いでしょうか。
オプション1は、簡単な方法を使用することです。
THREAD_POOL = Executors.newFixedThreadPool(threadPoolSize);
オプション2は、このような自分のThreadPoolExecutor
を作成することです:
RejectedExecutionHandler rejectHandler = new RejectedExecutionHandler() {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
try {
executor.getQueue().put(r);
} catch (Exception e) {}
}
};
THREAD_POOL = new ThreadPoolExecutor(threadPoolSize, threadPoolSize, 0, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(10000), rejectHandler);
私が使用しての利点であるかを理解したいと思いますより複雑なオプション2、またLinkedBlockingQueue
よりも別のデータ構造を使用する必要がある場合は?どんな助けもありがとう。
ある 'RejectedExecutionHandler'は実際、executor.getQueue()'へのコールをブロックして置く(R);キューが解放されるまで 'ブロックしますので。最終的に私のハンドラは任意のタスクを中止することなく境界キューを保持することができます。私が間違っていない限り。他の詳細については+1。 –
@CharlesMenguy:明確化のためにありがとう、私の悪い、私は私の質問を更新します。しかし、 'RejectedExecutionHandler'の内部をブロックすることで何を達成したいですか?私はそれが呼び出し側のスレッドをブロックするような、本当に予期せぬ副作用があるかもしれないと考えていますたぶんあなたは 'CallerRunsPolicy'を必要としますか? –
実際にそれを見た後、 'CallerRunsPolicy'は本当に私がやりたいことを約束しています。私は試してみてください!たぶんあなたは答えにそれを追加することができ、私はあなたの答えを受け入れるでしょう。 –