Synch ronousQueデータ構造の基本的な紹介
7168 ワード
Synch ronousQue
特徴は列をブロックするブロッキング・Queの一つの実現であり、方法はBlokingQueの基本的性質を持っている。 とArayBlocking Queの違いは、ArayBlocking Queの内部には、要素を格納するための配列があり、キャッシュエリアに相当する。Synch ronousQueに対しては、データを保存するための内部構造がない。 は、特定のスレッドAに対して、データを挿入するには、他のスレッドBがデータを取りたいと考えている必要があり、そうでなければ、スレッドAブロック(下の層はUsafe.parkを呼び出してブロックされている)。このように実現される目的は、生産データの速度と消費データのペースが一致することです。 主なデータ構造 Transferer Shared internal API for dual stacks and queues
上のインターフェイスはデータ転送のキーアプリを保存しています。上の英語は中国語に変換して、ダブルスタックとダブルキューの共有内部アプリとして表示すべきです。「ダブル」は主に検査を行います。データを取る時、スレッドがないとデータを保存します。データを取るノードを作成します。データを保存する場合、データを取るスレッドがないと、データを格納するノードを作成します。これらの二つのノードは同じ構造で表される。このチェーンには、同じ時刻に一つのタイプのノードしか存在しない。
Transfererインターフェースの二つの実装クラス: TransferStockは、非公正なアクセスデータを実現するために使用されます。 TransferQueは、公平なアクセスデータを実現するために使用されます。 モモ
出力結果は1または2かもしれません。二つのスレッドはそれぞれ一つのデータを挿入し、一つのスレッドはデータを取ります。実行後、スレッドがブロックされます。二つの数を入れてみたが、一つの数だけが消費された。もう一回消費しないと閉塞スレッドが解除されます。
特徴
上のインターフェイスはデータ転送のキーアプリを保存しています。上の英語は中国語に変換して、ダブルスタックとダブルキューの共有内部アプリとして表示すべきです。「ダブル」は主に検査を行います。データを取る時、スレッドがないとデータを保存します。データを取るノードを作成します。データを保存する場合、データを取るスレッドがないと、データを格納するノードを作成します。これらの二つのノードは同じ構造で表される。このチェーンには、同じ時刻に一つのタイプのノードしか存在しない。
Transfererインターフェースの二つの実装クラス:
import java.util.Collection;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.SynchronousQueue;
public class Test {
public static void main(String[] args) throws Exception {
SynchronousQueue<Integer> queue = new SynchronousQueue<>(true);
new Thread(() -> {
try {
queue.put(1);
}catch (InterruptedException e) {}
}, "producer1").start();
new Thread(() -> {
try {
queue.put(2);
}catch (InterruptedException e) {}
}, "producer2").start();
new Thread(() -> {
try {
System.out.println(queue.take());
}catch (InterruptedException e) {}
}, "consumer1").start();
}
}
結果分析:出力結果は1または2かもしれません。二つのスレッドはそれぞれ一つのデータを挿入し、一つのスレッドはデータを取ります。実行後、スレッドがブロックされます。二つの数を入れてみたが、一つの数だけが消費された。もう一回消費しないと閉塞スレッドが解除されます。