Javaでマルチスレッドのキューを使用する方法を教えてください。
BlockingQueue はスレッドセーフなキューで、Java でマルチスレッドキューを実装するために使用できます。要素の挿入および取得を実装するための put() と take() メソッドが用意されています。以下は BlockingQueue を使用するためのコード例です。
まず、BlockingQueueオブジェクトを作成します。
BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(10);
そして、put()メソッドを使って、Producerスレッド内でキューに要素を入れる
queue.put(1);
コンシューマースレッドでtake()メソッドを使用してキューから要素を取り出す。
int element = queue.take();
キューが空の場合、take() メソッドはキューに要素が利用可能になるまでスレッドをブロックしますのでご注意ください。
put()とtake()メソッドのほかに、BlockingQueueはoffer()、poll()、offer(timeout, TimeUnit)などのメソッドも提供しています。具体的なニーズに応じて選択できます。
複数の生産者スレッドと消費者スレッドを同時に起動する必要がある場合は、ExecutorServiceを使用してスレッドプールを管理できます。以下にサンプルコードを示します。
ExecutorService executor = Executors.newFixedThreadPool(2);
BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(10);
executor.submit(() -> {
try {
queue.put(1);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
});
executor.submit(() -> {
try {
int element = queue.take();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
});
executor.shutdown();
スレッドプールを活用して、複数の生成スレッドと消費スレッドを起動し、BlockingQueueを使用してスレッド間でデータをやりとりできます。