前に書く
最近、多くのネチズンが質問するメッセージを残しています:Java並行プログラミングには、ブロッキングキューであるBlockingQueueがあります。並行プログラミングでBlockingQueueを使用する理由は?さて、今日は一時的にBlockingQueueについて話しましょうが、今日はそれほど深くはありません。このクラスをソースから分析してみましょう。
BlockingQueueの概要
キューのブロックはスレッドセーフです。
ブロックされる状況は次のとおりです。
(1)キューがいっぱいの場合はキュー操作を入力
(2)キューが空の場合はキュー操作を実行
使用シナリオは次のとおりです。
主に生産者と消費者のシナリオで。
BlockingQueueメソッド
BlockingQueueには、キューの要素を挿入、削除、および検査するための4つの異なるメソッドがあります。要求された操作をすぐに実行できない場合、各メソッドの動作は異なります。これらのメソッドは次のとおりです。
例外を投げる | 特別な価値 | ブロックする | タイムアウト | |
---|---|---|---|---|
挿入 | 追加(e) | 申し出(e) | put(e) | オファー(e、時間、単位) |
取り除く | 削除する() | poll() | 取る() | poll(時間、単位) |
チェックする | 素子() | ピーク() | 利用できません | 利用できません |
行動の説明の4個の異なるセット
- 例外を投げる
試行した操作をすぐに実行できない場合は、例外をスローします。
- 特別な価値
試行された操作をすぐに実行できない場合、特定の値(多くの場合、true / false)が返されます。
- ブロックする
試行された操作をすぐに実行できない場合、メソッド呼び出しは、実行できるまでブロックされます。
- タイムアウト
試行された操作をすぐに実行できない場合、メソッド呼び出しは実行できるまでブロックされますが、待機時間は指定された値を超えません。操作が成功したかどうかを示す特定の値を返します(通常はtrue / false)。
BlockingQueue実装クラス
- ArrayBlockingQueue:制限されたブロッキングキュー(制限された容量、容量は初期化中に指定する必要があり、容量が指定された後は変更できません。内部実装は、データをFIFOモードで格納する配列です。最後に挿入されたオブジェクトはテールです最近削除されたオブジェクトは頭です。
- DelayQueue:ブロックされるのは内部要素であり、DelayQueueの要素はinterface-Delayedを実装する必要があります(JUCの下に存在します)。DelayedインターフェースはComparableインターフェースを継承します。これは、Delayedインターフェースのエレメントをソートする必要があるためです。通常、Delayedインターフェースのエレメントは、Delayedインターフェースのエレメントの有効期限の優先順位に従ってソートされます。主なアプリケーションシナリオは、接続の定期的なクローズ、オブジェクトのキャッシュ、タイムアウト処理などです。内部実装はPriorityQueueおよびReentrantLockを使用します。
- LinkedBlockingQueue:サイズ構成はオプションです。サイズが初期化中に指定された場合、サイズは制限されます。サイズが初期化中に指定されなかった場合、サイズは制限されません(実際、デフォルトサイズはInteger型の最大値です)。内部的に実装されている場合、リンクリストはFIFOの形式でデータを格納し、最後に挿入されたオブジェクトはテールで、最後に削除されたオブジェクトはヘッドです。
- PriorityBlockingQueue:優先度があり、境界がないブロッキングキューですが、空のオブジェクト(つまりnull)の挿入を許可する並べ替えルールがあります。挿入されたすべてのオブジェクトはComparableインターフェースを実装する必要があり、キューの優先順位の順序はComparableインターフェースの実装に従って定義されます。イテレーターはPriorityBlockingQueueから取得できますが、このイテレーターは優先順位で反復することを保証しません。
- SynchronousQueue:キュー内で許可される要素は1つだけです。スレッドが要素を挿入すると、その要素が別のスレッドによって消費されない限り、その要素はブロックされます。したがって、SynchronousQueueは同期キューとも呼ばれます。SynchronousQueueは、無制限の非キャッシュキューです。正確に言えば、要素は格納されません。要素の削除は、要素が削除されるのを待ってからでなければ、要素を再度配置できません。
最後に書く
この記事が役に立った場合は、WeChatで「Binghe Technology」のWeChatアカウントを検索してフォローし、Bingheで同時実行プログラミングのテクニックを学んでください。
最後に、コンカレントプログラミングで習得する必要があるコアスキルナレッジマップを添付します。コンカレントプログラミングを学習するときは、回り道を避けてください。