この質問で説明されている状況と同様の状況があります。
Java 電子メール送信キュー - 利用可能なメッセージを送信する固定数のスレッド
その中で、スレッドプールが離陸して実行されるコマンド(ICommandTask extends Callable{Object})を取得するブロッキングキューがあります。ブロッキング キューは、スレッドの同期と、呼び出し元のスレッドと実行中のスレッドの間の分離を提供します。プログラム全体のさまざまなオブジェクトが ICommandTasks をコマンド キューに送信できるため、AddTask() を静的にしました。
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import com.mypackage.tasks.ICommandTask;
public enum CommandQueue
{
INSTANCE;
private final BlockingQueue<ICommandTask> commandQueue;
private final ExecutorService executor;
private CommandQueue()
{
commandQueue = new LinkedBlockingQueue<ICommandTask>();
executor = Executors.newCachedThreadPool();
}
public static void start()
{
new Thread(INSTANCE.new WaitForProducers()).start();
}
public static void addTask(ICommandTask command)
{
INSTANCE.commandQueue.add(command);
}
private class WaitForProducers implements Runnable
{
@Override
public void run()
{
ICommandTask command;
while(true)
{
try
{
command = INSTANCE.commandQueue.take();
executor.submit(task);
}
catch (InterruptedException e)
{
// logging etc.
}
}
}
}
}
起動中のメイン プログラムでは、コマンド キューは、新しい CommandQueue オブジェクトを作成し、別のスレッドで WaitForProducers を開始する以下を使用して開始されます。
CommandQueue.Start();
シングルトン列挙型を使用して複数のプロデューサーを単一のエグゼキューターにセットアップするこの方法 (プログラムのさまざまな部分がアクセスできるようにするため) と、別のスレッドを使用してキューからタスクを取り出して ThreadPool に送信するかどうかを尋ねたかったのです。私が達成したいことをするための推奨される方法です。特に非常にマルチスレッド環境では。
これまでのところ問題なく動作しているようですが、CommandQueue と同様のオブジェクトを作成して、さまざまな種類のタスクを処理する予定です。それらは独自のキューに格納されます。たとえば、OrderQueue、EventQueue、NegotiationQueue などです。そのため、多少スケーラブルでスレッドセーフである必要があります。
前もって感謝します。