JavaのスレッドセーフBlockingQueueとは何ですか? いつ使うべきですか? 実装が添付されています

公開: 2021-04-30
JavaのThreadsafeBlockingQueueとは何ですか、いつ使用する必要がありますか

これまで、Crunchifyのプロデューサーコンシューマーの概念に関する2つの記事を書きました。 1つ目はJavaセマフォとMutexについて説明し、2つ目は同時読み取り/書き込みについて説明します。

このJavaチュートリアルでは、同じプロデューサー/コンシューマーの概念をBlockingQueue in Javaについて説明します。

Javaでキューをブロックする利点は何ですか?

java.util.Queueは、要素を取得するときにキューが空でなくなるのを待ち、要素を格納するときにキューでスペースが使用可能になるのを待つ操作をサポートします。

javaのjava.util.BlockingQueue-Crunchify

4つのJavaクラスを作成する必要があります。

  1. メッセージを入れて取得するためのCrunchifyMessage.java
  2. CrunchifyBlockingProducer.javaを使用して、メッセージをキューに入れます
  3. キューからメッセージを取得するためのCrunchifyBlockingConsumer.java
  4. CrunchifyBlockingMain.javaでテストを開始します

BlockingQueue thread-safeです。 すべてのキューイングメソッドは本質的にアトミックであり、内部ロックを使用します。

JavaでのスレッドセーフなBlockingQueueの実装を始めましょう

ステップ1

クラスCrunchifyMessage.javaを作成します。 これは単純なJavaオブジェクトです。

ステップ2

単純なメッセージを作成してキューに入れるプロデューサーCrunchifyBlockingProducer.javaを作成します。

ステップ-3

キューからのメッセージを消費するクラスCrunchifyBlockingConsumer.javaを作成します。

ステップ-4

BlockingQueueテストを実行する単純なCrunchifyBlockingMain.javaメソッドを作成します。 このプログラムを実行して、BlockingQueueの動作を確認します。

BlockingQueuenull要素を受け入れません。 実装は、 null追加配置、または提供しようとするとNullPointerExceptionをスローします。

nullは、ポーリング操作の失敗を示す番兵値として使用されます。

結果:

java.util.concurrent.BlockingQueueをいつ使用する必要がありますか?

  • ある種の着信要求を抑制したい場合は、同じものを使用する必要があります
  • プロデューサーは、無制限のキューでコンシューマーよりもはるかに先を行くことができます。 コンシューマーがプロデューサーに追いついていない場合は、 OutOfMemoryErrorが発生する可能性があります。 このような状況では、キューがいっぱいであることをプロデューサー候補に通知し、失敗した場合はすぐに諦める方がよい場合があります。
    • 言い換えれば、生産者は自然に抑制されます。
  • ブロッキングキューは通常、並行アプリケーションで使用されます
  • 正しく、スレッドセーフな実装を提供します
  • メモリ消費も制限する必要があります