1. BlockingQueue の紹介
1. キュー (キュー) の最上位インターフェイス
add(E) は要素を追加し、成功した場合は true を返し、それ以外の場合は例外を返します
offer(E) 要素を追加し、成功した場合は true を返し、それ以外の場合は false を返します
remove() は、キューの先頭要素を返して削除し、キューが空の場合は例外を返します
poll() はキューの最初の要素を返して削除し、キューが空の場合は null を返します
peek() キューの最初の要素を取得し、キューが空の場合は null を返します
BlockingQueue は Queue から継承し、ブロッキング機能を提供します。キューに出入りするための一般的なメソッドがあります。
エンキュー: put(E) offer(E) offer(E,long,TimeUnit)
出队:poll(),poll(long,TimeUnit),take()
1.1 実際の BlockingQueue の一般的な方法
このデモンストレーションでは、一般的に使用される 4 つのメソッドがあります。add remove offer ポーリングが使用されます。これは、キューの先入れ先出しの特性に準拠しています。
import java.util.Queue;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
public class BlockingQueueTest {
public static void main(String[] args) {
//测试add remove offer poll
Queue addblockingQueue = new ArrayBlockingQueue(2);
addblockingQueue.add(1);
addblockingQueue.add(2);
// addblockingQueue.add(3);//放入第三个Exception in thread "main" java.lang.IllegalStateException: Queue full
// addblockingQueue.remove();
// addblockingQueue.remove();
// addblockingQueue.remove();//移出第三个Exception in thread "main" java.util.NoSuchElementException
Queue offerblockingQueue = new ArrayBlockingQueue(2);
System.out.println(offerblockingQueue.offer(1));//返回true
System.out.println(offerblockingQueue.offer(2));//返回true
System.out.println(offerblockingQueue.offer(3));//返回false
System.out.println(offerblockingQueue.poll());//返回1
System.out.println(offerblockingQueue.poll());//返回1 符合队列特性先进先出
System.out.println(offerblockingQueue.poll());//返回null
}
}
1.2 一般的に使用されるキュー
キュー アプリケーションのシナリオ: キューはスレッド セーフであり、スレッド プール、プロデューサー/コンシューマー モードなどのミドルウェア、および nacos レジストリでよく使用されます。
1.2.1 ArrayBlockingQueue の概要 (TODO)
ArrayBlockingQueue は制限付きのブロッキング キューです. 最下層は配列の実装に基づいています. スレッドの安全性を確保するために reenTrantLock を使用します. 一般的にはこれを使用することをお勧めします. ただし, 並行性の高いシナリオでは reenTrantLock を使用してロックするためです.とロック解除, 挿入と抽出の速度. パフォーマンスのボトルネックと呼ばれます. LinkedBlockingQueue は一般に高同時実行シナリオで使用されます. 実際の戦闘コードについては 1.1 を参照してください.
ソースコード分析の焦点:
1. 施工方法
2. 使用される要素: 配列、reenTrantLock、2 つの条件付きキュー (満杯でも空でもない)
3.put メソッドと take メソッド
1.2.2 linkedBlockingQueue の紹介 (TODO)
linkedBlockingQueue は、連結リストによって実装された制限付きブロッキング キューですが、そのデフォルトの最大値は Integer.MAX_VALUE であり、非常に大きな数であるため、制限のないブロッキング キューと呼ばれることがよくあります。メモリが不足すると OOM の問題が発生するため、この問題を解決するために、初期化時にキューのサイズを指定するのが一般的です。linkedBlockingQueue also uses ReentrantLock to ensure thread safe. The difference between arrayBlockingQueue is that it has two locks, one for entering the queue and one for exit the queue. また、キューへの出入りのウェイクアップを保証するための 2 つの条件付きキューもあります。 .
ソースコード分析の焦点:
1. 施工方法
2. 使用要素
3.put,take,remove方法
1.2.3 LinkedBlockingDequeの紹介
Deque は、linkedBolckingQueue と同様の特性を持つブロッキング両端キューです.linkedBolckingQueue とは異なり、deque には reentrantLock ロックが 1 つだけあり、キューの先頭と末尾にある要素を操作するための API がいくつかあります。
addFirst(E e) addLast(E e) offerFirst(E e) offerLast(E e)