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は非機能モードです。項目の QNode は take スレッドと put スレッドであり、データは交換されますが、take メソッドによって交換されるデータは null です。
一致するたびにフロントノードが取り込まれ、データが返されることがわかります。正常に一致したノード
;Thread waiter: ブロックされたスレッド;
Object item: 対象となる値与えられた; int モード: ノードの分類、put または take を区別するために使用されます;転送のソース コード フローチャートも、以下に示すように構成されています:これらもリンク リストを使用して実装されていますが、これは構造が異なり、一致するノードを表す追加の一致があります。
このプロセスを通じて、mode には 3 つの値があることがわかります。0 と 1 に加えて、一致するノードを表す 2 もあります。主に上の図の赤枠部分で、がヘッド ノードが進行中でないことを検出すると、現在のスレッドは一致するノードを作成し、それをヘッドに追加し、最後に次のノードと一致させます
。一致するノードが見つかった場合、一致するノードはリンク リストから削除されます。
プロセス分析により、TransferStack は後から入ってくるスレッドの先頭に配置されており、最初に一致することがわかります
。以上がJavaのSynchronousQueueとは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。