を使用する場合、プール内のスレッドによって順番に実行されるスレッドプールにジョブをExecutorService
送信します。Runnable
次のいずれかを実行できます。
それぞれRunnable
をループに入れ、ループ内からデキューしてBlockingQueue
各パケットを処理します。それは、それらすべてがバッファオブジェクトの周りで同期するよりも簡単かもしれません。何かのようなもの:
public void run() {
while (!shutdown) {
packet = packetQueue.take();
processPacket(packet);
}
}
または、オブジェクトの負荷が増える可能性がありますが、各パケットをジョブ自体としてスレッドプールに送信することもできます。各パケットを処理し、ペイロードを抽出し、ペイロードを処理するメソッドを使用Runnable
してペイロードのラッパーを作成できます。run()
クラスの内容は次のRunnable
ようになります。
Payload payload;
public void run() {
// process packet here
processPayload(payload);
}
どちらのメカニズムでも、プロセッサの数と処理タスクの性質に最も一致する固定スレッド番号を選択します。以下の例では、プロセッサの数を使用していますが、GCまたはその他のタスクのためにいくつかのプロセッサを削除することをお勧めします。処理が他のIOでブロックされる場合に備えて、さらに多くの情報を追加することをお勧めします。パフォーマンステストだけが、そこに最適な値が何であるかを教えてくれます。
// start a pool that uses the number of threads that there are processors
ExecutorService threadPool = Executors.newFixedThreadPool(
Runtime.getRuntime().availableProcessors());