JavaのBlockingQueueとは何ですか?それを実装する方法は?



JavaでのBlockingQueueに関するこの記事は、BlockingQueueインターフェースについて学習するのに役立ちます。また、その方法と実際の実装についての洞察も得られます。

組み込み機能の包括的な範囲のため、プログラマーの間で非常に人気があります。ほとんどの場合、問題が発生する前であっても、問題に対する専用の解決策があります。のそのような非常に有用で重要な部分 JavaのBlockingQueueインターフェースです。この記事の媒体を通して、JavaのBlockingQueueとそれを実装する方法に光を当てます。

この記事で取り上げるトピックは次のとおりです。





JavaのBlockingQueueインターフェイス

JavaのBlockingQueue は、ConcurrentHashMap、CopyOnWriteArrrayListなどの他のいくつかの同時ユーティリティクラスとともにJava1.5で追加されたインターフェイスです。BlockingQueueインターフェイスはに属します。 java.util.concurrent パッケージこのインターフェイスは、スレッドが空のキューをデキューしようとしたり、フルキューをエンキューしようとした場合に、ブロッキングをアクティブにすることでフロー制御を強化します。どちらの場合でも、このインターフェースは便利です。簡単に言えば、 すでに満杯のキューに要素を追加しようとしています。プログラムのこの時点で、BlockingQueueが呼び出され、別のスレッドがキューを解放してスペースを作るまで、その特定のスレッドをブロックします。これは、キュー全体のクリアランスの要素のデキューの結果である可能性があります。同様に、BlockingQueueが呼び出されて、他のスレッドが空のスレッドに要素を挿入または追加するまで、すでに空のキューをデキューしようとしているスレッドをブロックします。 キュー

JavaでBlockingQueueインターフェースを操作するときは、null値を受け入れないことに注意する必要があります。これを行おうとすると、即座にNullPointerExceptionがスローされます。次の図は、JavaでのBlockingQueueインターフェースの動作を表しています。



BlockingQueue-JavaのBlockingQueue-Edurekaこの インターフェース スレッドセーフであるため、主にプロデューサーとコンシューマーの間で使用されます。つまり、BlockingQueueインターフェイスを使用して、プロデューサーとコンシューマーの両方で共有できるキューを作成できます。

JavaでBlockingQueueを操作するには、まず、そのタイプに精通する必要があります。この記事の次のセクションでそれらを紹介します。

JavaのBlockingQueueのコンストラクターのタイプ

JavaのBlockingQueueインターフェースのコンストラクターには2つのタイプがあります。



  • 無制限のキュー: このタイプのキューの場合、容量はInteger.MAX_VALUEに設定されます。制限のないキューは、要素が挿入されるたびに動的に大きくなる可能性があるため、ブロックされることはありません。以下は、無制限のキューを作成するための構文です。
BlockingQueue bq = new LinkedBlockingDeque()
  • 制限付きキュー: この種のキューの場合、作成時にキューの容量を渡す必要があります。 ビルダー パラメータ。サイズが割り当てられると、変更することはできません。以下は、制限付きキューを作成するための構文です。
BlockingQueue bq = new LinkedBlockingDeque(10)

JavaでBlockingQueueを実装する方法に慣れてきたので、そのメソッドのいくつかをリストアップしましょう。

Javaでクラスパスを設定する

BlockingQueueインターフェイスのメソッド

方法 説明
boolean add(E e) このメソッドは、キューにスペースがある場合に指定された要素をこのキューに挿入するのに役立ちます。投げるIllegalStateException
boolean contains(Object o) キューに指定された要素が含まれている場合、このメソッドはtrueを返します
intdrainTo(コレクションc) このメソッドは、キューから使用可能なすべての要素を削除し、それらを指定されたコレクションに追加します
intdrainTo(コレクションc、int maxElements) このメソッドは、指定された数の使用可能な要素をキューから削除し、指定された要素に追加します
booloeanオファー(E e) このメソッドは、指定された要素がいっぱいでない場合はキューに挿入してtrueを返し、そうでない場合はfalseを返します。
ブールオファー(E e、長いタイムアウト、TimeUnit単位) このメソッドは、指定された要素をキューに挿入します。キューがいっぱいの場合、スペースが使用可能になるまで、指定された待機時間まで待機します。
Eポーリング(長いタイムアウト、TimeUnit単位) このメソッドは、キューの先頭を取得および削除するのに役立ちます。キューが空の場合、要素が使用可能になるまで指定された待機時間まで待機します
void put(E e) このメソッドは、キューがいっぱいの場合にスペースが使用可能になるのを待つことによって、指定された要素をキューに挿入します
intremainingCapacity() このメソッドは、このキューがブロックされることなく理想的に受け入れることができる追加の要素の数を返すのに役立ちます
boolean remove(Object o) このメソッドは、指定された要素の単一のインスタンスが存在する場合にのみ、キューから削除します
E take() このメソッドは、キューが空の場合に要素が使用可能になるのを待つことで、キューの先頭を取得および削除するのに役立ちます。

BlockingQueueの実装

ここでは、JavaでBlockingQueueの簡単な例を実装します。クラスEduProducerはデータを生成し、それを キュー 同時に、別のクラスであるEduConsumerは、同じキューからデータを削除します。

このために、私は3つのクラスを作成します。

  1. EduProducer
  2. EduConsumer
  3. EdurekaMain

これらの各クラスを1つずつ作成してみましょう。

javascriptのindexofとは何ですか

EduProducer.java

パッケージedurekaimport java.util.concurrent.BlockingQueue public class EduProducerimplements Runnable {private final BlockingQueue queue @Override public void run(){try {process()} catch(InterruptedException e){Thread.currentThread()。interrupt()} } private void process()throws InterruptedException {// 10 intをキューに入れますfor(int i = 0 i<10 i++) { System.out.println('[Producer] Add : ' + i) queue.put(i) System.out.println('[Producer] Queue's Remaining Capacity : ' + queue.remainingCapacity()) Thread.sleep(150) } } public EduProducer(BlockingQueue queue) { this.queue = queue } }

EduConsumer.java

パッケージedurekaimport java.util.concurrent.BlockingQueue public class EduConsumerimplements Runnable {private final BlockingQueue queue @Override public void run(){try {while(true){Integer take = queue.take()process(take)}} catch (InterruptedException e){Thread.currentThread()。interrupt()}} private void process(Integer take)throws InterruptedException {System.out.println( '[Consumer] Remove:' + take)Thread.sleep(500)} public EduConsumer(BlockingQueue queue){this.queue = queue}}

EdurekaMain.java

パッケージedurekaimport java.util.concurrent.BlockingQueue import java.util.concurrent.LinkedBlockingQueue public class EdurekaMain {public static void main(String [] args){BlockingQueue queue = new LinkedBlockingQueue(10)new Thread(new EduProducer(queue)) .start()new Thread(new EduConsumer(queue))。start()}}

コードの記述が完了したら、プログラムを実行して以下の出力を取得します。

[プロデューサー]追加:0 [消費者]テイク:0 [プロデューサー]キューの残り容量:9 [プロデューサー]追加:1 [プロデューサー]キューの残り容量:9 [プロデューサー]追加:2 [プロデューサー]キューの残り容量:8 [プロデューサー] ]追加:3 [プロデューサー]キューの残り容量:7 [消費者]テイク:1 [プロデューサー]追加:4 [プロデューサー]キューの残り容量:7 [プロデューサー]追加:5 [プロデューサー]キューの残り容量:6 [プロデューサー]追加:6 [プロデューサー]キューの残り容量:5 [消費者]テイク:2 [プロデューサー]追加:7 [プロデューサー]キューの残り容量:5 [プロデューサー]追加:8 [プロデューサー]キューの残り容量:4 [プロデューサー]追加:9 [プロデューサー]キューの残り容量:3 [消費者]テイク:3 [消費者]テイク:4 [消費者]テイク:5 [消費者]テイク:6 [消費者]テイク:7 [消費者]テイク:8 [消費者]テイク:9

これで、JavaのBlockingQueueに関するこの記事は終わりです。 Javaをより詳細に学習したい場合は、 同じように。

JavaでのBlockingQueueの基本を理解したので、 25万人以上の満足した学習者のネットワークを持つ信頼できるオンライン学習会社であるEdurekaが世界中に広がっています。 EdurekaのJavaJ2EEおよびSOAトレーニングおよび認定コースは、Java開発者になりたい学生および専門家向けに設計されています。このコースは、Javaプログラミングをすぐに開始できるように設計されており、HibernateやSpringなどのさまざまなJavaフレームワークに加えて、コアと高度なJavaの両方の概念についてトレーニングします。

質問がありますか?この「JavaのBlockingQueue」のコメントセクションにその旨を記載してください。できるだけ早くご連絡いたします。