ホームページ  >  記事  >  Java  >  同期、非同期、ブロッキング、ノンブロッキングの違いについて詳しく説明

同期、非同期、ブロッキング、ノンブロッキングの違いについて詳しく説明

Y2J
Y2Jオリジナル
2017-05-06 13:03:451548ブラウズ

この記事では、Java における同期、非同期、ブロッキング、非ブロッキングの違いの詳細な説明に関する関連情報を主に紹介します。必要な方は参考にしてください。

同期、非同期、ブロッキングと非ブロッキングの違いの詳細な説明。 Java ではノンブロッキング

シンプルに言ってください:

ブロッキングとは、作業が完了するまで戻ることを許可されず、問題が処理されるまで戻る前に常に待機することを意味します。 -ブロッキングとは、あなたが最初にそれを行うことを意味します。何かが行き詰まっていることに気づいたら、私は最初に他にやるべきことがないか確認します。すぐにリーダーに報告してください。

最も一般的に使用される 2 つの関数、send と recv を例として挙げてみましょう...

たとえば、特定の Byte を送信するために send 関数を呼び出した場合、システム内で send によって行われる作業は実際には次のとおりです。データを TCP/IP プロトコル スタックの出力バッファに転送 (コピー) する場合、TCP/IP プロトコル スタックにデータを保存するのに十分なバッファがない場合、その実行が成功してもデータが正常に送信されたことにはなりません。コピーされました...これは反映されます ブロッキングと非ブロッキングの違いは次のとおりです。ブロッキング モードの場合、送信するデータをコピーするのに十分なスペースがシステム バッファーに確保されるまでソケット送信関数は戻りませんが、ノンブロッキング ソケットの場合は、 send はすぐに WSAEWOULDDBLOCK を返し、呼び出し元に「送信操作はブロックされています!!! 対処方法は見つかります...」と伝えます。この関数は実際には TCP/IP プロトコル スタックを待っています。受信バッファは次のように通知します。ブロッキング モードのソケットの場合、TCP/IP プロトコル スタックの受信バッファが通知しない場合。結果は返されません: システム リソースを消費します ...ノンブロッキング モードのソケットの場合、この関数はすぐに戻り、次のように通知します: WSAEWOULDDBLOCK---「現在データがありません。後で確認してください。」

拡張:

ネットワーク

プログラミングを行うとき、同期、非同期、ブロッキング、ノンブロッキングの4つの呼び出しメソッドをよく見かけます。これらの方法を相互に理解するのは簡単ではありません。これらの用語についての私の理解を以下に示します。

1. 同期

いわゆる同期とは、関数呼び出しを発行したときに、結果が得られるまで呼び出しが返されないことを意味します。この定義によれば、実際、ほとんどの関数は同期的に呼び出されます (sin、isdigit など)。ただし、一般的に、同期と非同期について話すときは、他のコンポーネントの協力が必要なタスク、または完了するまでに一定の時間がかかるタスクを特に指します。最も一般的な例は SendMessage です。この関数はメッセージをウィンドウに送信し、相手がメッセージを処理するまで戻りません。相手の処理が終了すると、関数はメッセージ処理関数から返された LRESULT 値を呼び出し元に返します。

2. 非同期

非同期の概念は同期の反対です。非同期プロシージャ呼び出しが発行された場合、呼び出し元は結果をすぐには取得しません。この呼び出しを実際に処理するコンポーネントは、完了時にステータス、通知、コールバックを通じて呼び出し元に通知します。 CAsycSocket クラスを例に挙げます (CSocket は CAsyncSocket から派生していますが、その関数は非同期から同期に変換されていることに注意してください)。クライアントが Connect 関数を呼び出して接続要求を発行すると、呼び出し元のスレッドはすぐに下向きに実行されます。実際に接続が確立されると、ソケットの最下位層がメッセージを送信して オブジェクト

に通知します。ここでは、実行コンポーネントと呼び出し元がステータス、通知、コールバックの 3 つのチャネルを通じて結果を返すことが述べられています。どちらを使用できるかはエグゼクティブの実装に依存し、エグゼクティブが複数の選択肢を提供しない限り、呼び出し元の制御下にはありません。実行コンポーネントがステータスを使用して通知する場合、呼び出し元は一定時間ごとにそれをチェックする必要があり、非常に非効率的です (マルチスレッド プログラミングに慣れていない人の中には、常にループを使用して特定の

変数の値をチェックすることを好む人もいます) これは実際には非常に重大な間違いです)。通知を使用すると、実行コンポーネントに追加の操作がほとんど必要ないため、効率が非常に高くなります。 コールバック関数に関しては、実際には通知とあまり変わりません。 3. ブロック

呼び出しのブロックとは、呼び出し結果が返される前に現在のスレッドが一時停止されることを意味します。関数は結果を取得した後にのみ戻ります。ブロック呼び出しと同期呼び出しを同一視する人もいますが、実際には異なります。同期呼び出しの場合、多くの場合、現在のスレッドはまだアクティブですが、論理的には現在の関数は戻りません。たとえば、CSocket で Receive 関数を呼び出します。バッファーにデータがない場合、この関数はデータが存在するまで待機してから戻ります。現時点では、現在のスレッドはさまざまなメッセージの処理を続けます。メイン ウィンドウと呼び出し関数が同じスレッド内にある場合、特別なインターフェイス操作関数で呼び出さない限り、メイン インターフェイスは引き続き更新される必要があります。 Recv は、ソケットがデータを受信するために使用する別の関数であり、ブロッキング呼び出しの例です。ソケットがブロッキング モードで動作しているときに、データなしでこの関数が呼び出された場合、現在のスレッドはデータが存在するまで一時停止されます。

4. ノンブロッキング

ノンブロッキングとブロッキングの概念は相互に対応しており、関数は現在のスレッドをブロックせず、結果をすぐに取得できなくなる前にすぐに戻ることを意味します。

オブジェクトのブロッキングモードとブロッキング関数呼び出し

オブジェクトがブロッキングモードであるかどうかと関数がブロッキング呼び出しであるかどうかは強い関係がありますが、1対1の対応はありません。ブロックしているオブジェクトには非ブロック呼び出しメソッドが存在する可能性があり、特定の API を通じてステータスをポーリングし、適切なタイミングでブロック関数を呼び出してブロックを回避できます。非ブロッキング オブジェクトの場合、特別な関数を呼び出すとブロッキング呼び出しに入る可能性があります。機能選択はその一例です。

【関連おすすめ】

1. Java無料ビデオチュートリアル

2. Geek Academy Javaビデオチュートリアル

3.

以上が同期、非同期、ブロッキング、ノンブロッキングの違いについて詳しく説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。