ホームページ >Java >&#&チュートリアル >JavaのSynchronousQueueとは何ですか

JavaのSynchronousQueueとは何ですか

王林
王林転載
2023-04-30 13:04:181335ブラウズ

関数説明

SynchronousQueueを理解するには、まずその機能を知る必要があります。このクラスの目的と提供する機能を知っていれば、ソースを読むときに迷うことはありません。コード。

以前の研究では、 スレッドがデータを交換したい場合、通常はパブリック変数または同期ブロッキング キューを使用します。プロデューサ スレッドは変数を設定するか値をキューに入れ、コンシューマ スレッドは変数を設定するか、値をキューに入れます。 thread スレッドは変数を読み取るか、キューから を取得します。

SynchronousQueue は、スレッド間で交換されるデータを保存する必要はなく、プロデューサーとコンシューマーを 1 つずつ照合するマッチャーのような機能を持ちます。

一般的なプロセス

たとえば、スレッドが put メソッドを呼び出し、キューに take スレッドがないことが判明すると、put スレッドはブロックされます。 take スレッドが入ってくると、ブロックされている put スレッドが存在することがわかり、両者は一致し、take スレッドは put スレッドのデータを取得し、どちらのスレッドもブロックされません。

逆に、take メソッドを呼び出しているスレッドもブロックしますが、put メソッドを呼び出しているスレッドが入ってきた場合は、それもマッチングします。

take または put スレッドが入ってきて、同じタイプの take または put スレッドがブロックされていることが判明した場合、そのスレッドは、別のタイプのスレッドが入ってくるまで後方のキューに入れられます。スレッド の 1 つと一致します。

プロセスの説明を通じて、SynchronousQueue についてある程度理解できたと思います。また、なぜ SynchronousQueue が要素を保存する必要がないのかもわかりました。

ソースコード分析

SynchronousQueue の take メソッドと put メソッドを確認すると、両方とも属性転送機能の転送メソッドと呼ばれていることがわかりました であり、transferer 属性は SynchronousQueue の抽象静的内部クラス Transferer です。 Transferer には、TransferQueue と TransferStack という 2 つのサブクラスがあります。

SynchronousQueue コンストラクターでは、渡されたパラメーター フェアを使用して、TransferQueue または TransferStack を作成するかどうかを決定します。パラメーター フェアによれば、TransferQueue はフェア モードである必要があり、次に TransferStackは非機能モードです。

フェアモード TransferQueue の実装

まず、内部クラス QNode を持っています。上記の分析により、複数のコンシューマーまたは複数のプロデューサーが存在する可能性があることがわかります。 、そしてそれらはキューを形成します、そしてQNodeはキューを形成するために使用されるリンクされたリストです。

QNode には主に 4 つの属性があります:

QNode next: 次のノードを表します;

オブジェクト項目; ここに実際に出力されるデータ、take メソッドによって生成されたノードがありますここは null;

Thread waiter; ブロックされたスレッドは、通常、このノードを生成したスレッドによってブロックされます。他のスレッドはデータを取得した後に起動します;

boolean isData: true は、世代を置くことを意味します, false は take によって生成されることを意味します;

take と put は両方とも転送メソッドに依存するため、転送の実装を見てみましょう。ソース コードが長すぎるため掲載されません。要約フローチャート:

JavaのSynchronousQueueとは何ですか

このメソッドは制御にロックを使用しないため、プロセス全体で依然として多くの判断が行われます。これらは二次的なものです。メインとキーは次のとおりです。プロセス。

簡単に説明すると、プロセス全体は QNode リンク リストに依存しています。QNode の isData によって take メソッドと put メソッドが区別されます。リンク リスト内のノードの isData は同じである必要があります。

項目の QNode は take スレッドと put スレッドであり、データは交換されますが、take メソッドによって交換されるデータは null です。

一致するたびにフロントノードが取り込まれ、データが返されることがわかります。

アンフェア モード TransferStack

同様に、TransferStack にも SNode と呼ばれるリンク リスト構造があり、SNode の主な属性は次のとおりです。 : 次のノード;

SNode match:

正常に一致したノード

;

Thread waiter: ブロックされたスレッド;

Object item: 対象となる値与えられた;

int モード: ノードの分類、put または take を区別するために使用されます;

転送のソース コード フローチャートも、以下に示すように構成されています:

これらもリンク リストを使用して実装されていますが、これは構造が異なり、一致するノードを表す追加の一致があります。 JavaのSynchronousQueueとは何ですか

このプロセスを通じて、mode には 3 つの値があることがわかります。0 と 1 に加えて、一致するノードを表す 2 もあります。主に上の図の赤枠部分で、

がヘッド ノードが進行中でないことを検出すると、現在のスレッドは一致するノードを作成し、それをヘッドに追加し、最後に次のノードと一致させます

一致するノードが見つかった場合、一致するノードはリンク リストから削除されます。

プロセス分析により、

TransferStack は後から入ってくるスレッドの先頭に配置されており、最初に一致することがわかります

以上がJavaのSynchronousQueueとは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。