検索
ホームページJava&#&チュートリアルJavaマルチスレッドにおけるスレッド間通信の詳細説明

次のエディターは、Java マルチスレッド プログラミングの学習 (スレッド間通信) に関する記事をお届けします。編集者はこれがとても良いと思ったので、参考として共有します。エディターをフォローして、一緒に見てみましょう

1. 概要

オペレーティングシステムではスレッドは独立した個体ですが、これらの個体は特別な処理をしないと全体になりません。スレッド間の通信は全体として一つになります。必須のソリューションを紹介します。スレッドが通信できるようになると、システム間の対話性がより強力になり、CPU 使用率が大幅に向上すると同時に、プログラマーが各スレッドのタスクの処理を効果的に制御および監視できるようになります。

2. 待機/通知メカニズム

1. "待機/通知" メカニズム: 待機/通知メカニズム。待機によりスレッドが一時停止され、通知により一時停止されたスレッドが実行を継続します。シェフとウェイターのやり取りを使って説明してみましょう:

(1) ウェイターが料理を受け取る時間はシェフに依存するため、ウェイターは「待ち」状態になります。

(2) シェフが料理を「配膳テーブル」に置くと、初めてウェイターが料理を受け取り、食事者に渡すことができます。

2. wait()

(1) は、現在コードを実行しているスレッドを待機させます。 wait() メソッドは、Object クラスのメソッドです。このメソッドは、現在のスレッドを「実行前キュー」に配置し、通知が受信されるまで、wait() が配置されているコード行で実行を停止するために使用されます。中断されました。

(2) wait() メソッドを呼び出す前に、スレッドはオブジェクトのオブジェクトレベルのロックを取得する必要があります。つまり、wait() メソッドは同期メソッドまたは同期ブロックでのみ呼び出すことができます。それ以外の場合は、IllegalMonitorStateException 例外が発生します。投げられるだろう。 (Runtime のサブクラスに属し、例外をキャッチするために try-catch ステートメントは必要ありません)

(3) wait() メソッドを呼び出した後、現在のスレッドはロックを解放し、このオブジェクトはスレッド待機プールに入ります。目覚めるのを待っています。 wait() から戻る前に、スレッドはロックを取り戻すために他の待機スレッドと競合します。

(4) wait() メソッドは割り込みにより中断され、InterruptedException をスローすることができます。

(5) wait(long): 1 つのパラメーターを持つ wait(long) メソッドの機能は、スレッドが一定時間内にロックをウェイクアップするのを待機することです。この時間を超えると、スレッドは自動的にウェイクアップします。上。

3. Notice()

(1) は、オブジェクトのオブジェクト ロックを待機している可能性がある他のスレッドに通知するために使用されます。複数のスレッドが待機している場合、スレッドプランナは待機状態にあるスレッドをランダムに1つ選択し、それに対してnotify通知を発行し、waitさせてオブジェクトのオブジェクトロックを取得します。 (注意! ここで話しているのは waiting です。つまり、notify() メソッドの実行後、現在のスレッドはオブジェクト ロックをすぐには解放しません。つまり、wait() 状態にあるスレッドはすぐには解放しません。オブジェクトのロックを取得するには、同期されたコードが必要です。ロックは、ブロック内のコードが実行された後にのみ解放されます。)

(2) も、同期されたメソッドまたは同期されたブロック内で呼び出される必要があります。つまり、スレッドは、呼び出しの前にオブジェクトのオブジェクトレベルのロックも取得します。そうしないと、IllegalMonitorStateException がスローされます。

(3) Notice() が通知を送信しても、待機している wait() スレッドがない場合は、効果がありません。

4. NoticeAll()

(1) は、同じ共有リソース (つまり、同じロック) を待機している待機キュー内の「すべての」スレッドを待機状態から抜け出して、実行可能状態に移行させることができます。

5、

6、サスペンドデス: 「サスペンドデス」現象は、実際にはスレッドが WAITING 待機状態になることです。すべてのスレッドが待機状態になると、プログラムは機能を実行できなくなり、プロジェクト全体が停止状態になります。 この理由は次のとおりです。たとえば、複数のプロデューサと複数のコンシューマの場合、「プロデューサ」が「プロデューサ」を起動し、「コンシューマ」が「コンシューマ」を起動し、同じ種類の「コンシューマ」が起動する可能性があります。となり、スレッドは実行を継続します。この問題を解決するにはどうすればよいでしょうか?単にnotify()をnotifyAll()メソッドに変更するだけです。つまり、異種のものを一緒に起動するだけです。

7, Jave では、パイプ ストリーム (pipeStream) は、さまざまなスレッドでデータを直接送信するために使用できる特別なストリームです。 1 つのスレッドは出力パイプにデータを送信し、別のスレッドは入力パイプからデータを読み取ります。パイプを使用すると、一時ファイルなどに頼ることなく、異なるスレッド間の通信が実現されます。 JDK には、バイト ストリーム (PipedOutputStream、PipedInputStream) および文字ストリーム (PipedWriter、PipedReader) を含むスレッド間の通信を可能にする 4 つのクラスが提供されています。


public class Run {
 public static void main(String[] args) {
  try {
   WriteData writeData = new WriteData();
   ReadData readData = new ReadData();
   PipedOutputStream outputStream = new PipedOutputStream();
   PipedInputStream inputStream = new PipedInputStream();
   
   outputStream.connect(inputStream);//使两个Stream之间产生通信链接,这样才可以将数据进行输入输出

   ThreadRead threadRead = new ThreadRead(readData, inputStream);
   threadRead.start();
   Thread.sleep(1000);
   ThreadWrite threadWrite = new ThreadWrite(writeData, outputStream);
   threadWrite.start();
  } catch (IOException e) {
   e.printStackTrace();
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
 }
}

3. joinメソッドの使用

1. 多くの場合、メインスレッドがサブスレッドを作成して開始し、時間のかかる大量の計算をサブスレッドで実行する場合、サブスレッドが終了する前にメインスレッドが終了することがよくあります。 。このとき、例えばサブスレッドがデータを処理し、メインスレッドがそのデータの値を取得したい場合など、メインスレッドがサブスレッドの実行完了を待って終了したい場合、 join() メソッドを使用する必要があります。

2. join() の機能は、スレッドが破棄されるのを待つことです。これにより、現在のスレッドが無期限にブロックされ、現在のスレッドのコードの実行を続行する前に、join() スレッドが破棄されるのを待ちます。 。

3. 同様に、join() メソッドは、interrupt() メソッドによって中断され、InterruptedException をスローすることができます。

4. 参加と同期の違いは何ですか?

(1) join() は内部的に wait() メソッドを使用して待機します。

(2) synchronized キーワードは、同期として「オブジェクト モニター」原理を使用します。

5. メソッド join(long) と sleep(long) の違いは何ですか?

(1) join(long) は wait(long) メソッドを使用して内部的に実装されており、wait(long) メソッドの実行後、現在のスレッドのロックが解放され、他のスレッドもこの中で同期メソッドを呼び出すことができます。糸。つまり、join(long) の後、スレッドはロックを解放し、ロック リソースを求めて他のスレッドと競合する必要があります。

(2) Thread.sleep(long) メソッドはロックを解放しません。

4. ThreadLocal クラスの使用

1. 変数値はパブリック静的変数の形式で共有できます。すべてのスレッドは同じパブリック静的変数を使用します。各スレッドに独自の共有変数を持たせたい場合、この問題を解決するにはどうすればよいでしょうか? ThreadLocal クラスは、各スレッドを独自の値にバインドする問題を解決します。ThreadLocal クラスは、各スレッドのプライベート データを格納できるボックスにたとえることができます。

2. ThreadLocal クラスには分離性があります。つまり、各スレッドは互いに影響を与えることなく自分のスレッドのデータを保存でき、取得するデータも自分のスレッドによって保存されたデータです。

5. クラス InheritableThreadLocal の使用

1. InheritableThreadLocal クラスは ThreadLocal クラスを継承するため、ThreadLocal クラスの特性を持ちます。でもそれは特別ですThreadLocal の特徴は、InheritableThreadLocal 変数の値がすべての子スレッドに自動的に渡されることですが、通常の ThreadLocal 変数は渡されないことです。さらに、このクラスの childValue メソッドをオーバーライドすることで、子スレッドは、 の任意の関数の親スレッド値として使用できます。

備考:

(1) サブスレッドとは何ですか?

Thread = new Thread(new ThreadStart(delegate{

})); に含まれるスレッドは子スレッドとみなされます。 (個人的な理解です)


(2)メインスレッドとは何ですか?

「スレッドに含まれないプログラム」を除いて、UIインターフェイスとMain関数は両方ともメインスレッドと見なすことができます。 (個人的な理解です)

以上がJavaマルチスレッドにおけるスレッド間通信の詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
JVMのクラスローダーサブシステムは、プラットフォームの独立性にどのように貢献していますか?JVMのクラスローダーサブシステムは、プラットフォームの独立性にどのように貢献していますか?Apr 23, 2025 am 12:14 AM

クラスローダーは、統一されたクラスファイル形式、動的読み込み、親代表団モデル、プラットフォーム非依存バイトコードを通じて、さまざまなプラットフォーム上のJavaプログラムの一貫性と互換性を保証し、プラットフォームの独立性を実現します。

Javaコンパイラはプラットフォーム固有のコードを作成しますか?説明する。Javaコンパイラはプラットフォーム固有のコードを作成しますか?説明する。Apr 23, 2025 am 12:09 AM

Javaコンパイラによって生成されたコードはプラットフォームに依存しませんが、最終的に実行されるコードはプラットフォーム固有です。 1。Javaソースコードは、プラットフォームに依存しないバイトコードにコンパイルされます。 2。JVMは、特定のプラットフォームのバイトコードをマシンコードに変換し、クロスプラットフォーム操作を保証しますが、パフォーマンスは異なる場合があります。

JVMは、さまざまなオペレーティングシステムでマルチスレッドをどのように処理しますか?JVMは、さまざまなオペレーティングシステムでマルチスレッドをどのように処理しますか?Apr 23, 2025 am 12:07 AM

マルチスレッドは、プログラムの応答性とリソースの利用を改善し、複雑な同時タスクを処理できるため、最新のプログラミングで重要です。 JVMは、スレッドマッピング、スケジューリングメカニズム、同期ロックメカニズムを介して、異なるオペレーティングシステム上のマルチスレッドの一貫性と効率を保証します。

Javaの文脈では、「プラットフォームの独立」とはどういう意味ですか?Javaの文脈では、「プラットフォームの独立」とはどういう意味ですか?Apr 23, 2025 am 12:05 AM

Javaのプラットフォームの独立性とは、書かれたコードがJVMが変更なしでインストールされた任意のプラットフォームで実行できることを意味します。 1)JavaソースコードはBytecodeにコンパイルされ、2)BytecodeはJVMによって解釈および実行されます、3)JVMは、プログラムが異なるオペレーティングシステムで実行されることを確認するために、メモリ管理とガベージコレクション機能を提供します。

Javaアプリケーションは、プラットフォーム固有のバグや問題に遭遇する可能性がありますか?Javaアプリケーションは、プラットフォーム固有のバグや問題に遭遇する可能性がありますか?Apr 23, 2025 am 12:03 AM

JavaApplicationScanIndEDENCOUNTIONPLATFORM-SPECISTESUESUSESEJVM'SABSTRACTION.REASONSINCLUDE:1)NativeCodeandLibraries、2)OperatingSystemDifferences、3)JVMimplementationVariations、および4)HardweardePencies.TomiteTETETETESES、DEVELAPERSHOULD:1)

クラウドコンピューティングは、Javaのプラットフォーム独立の重要性にどのような影響を与えますか?クラウドコンピューティングは、Javaのプラットフォーム独立の重要性にどのような影響を与えますか?Apr 22, 2025 pm 07:05 PM

クラウドコンピューティングにより、Javaのプラットフォームの独立性が大幅に向上します。 1)JavaコードはBytecodeにコンパイルされ、異なるオペレーティングシステムでJVMによって実行され、クロスプラットフォーム操作が確保されます。 2)DockerとKubernetesを使用してJavaアプリケーションを展開して、携帯性とスケーラビリティを向上させます。

Javaのプラットフォームの独立性は、その広範な採用においてどのような役割を果たしましたか?Javaのプラットフォームの独立性は、その広範な採用においてどのような役割を果たしましたか?Apr 22, 2025 pm 06:53 PM

java'splatformendenceallowsdevelopersowritecodeodeonceanceandonitondeviceoros withajvm.

コンテナ化テクノロジー(Dockerなど)は、Javaのプラットフォーム独立性の重要性にどのように影響しますか?コンテナ化テクノロジー(Dockerなど)は、Javaのプラットフォーム独立性の重要性にどのように影響しますか?Apr 22, 2025 pm 06:49 PM

Dockerなどのコンテナ化技術は、Javaのプラットフォームの独立性を置き換えるのではなく、強化します。 1)環境全体の一貫性を確保し、2)特定のJVMバージョンを含む依存関係を管理する、3)展開プロセスを簡素化して、Javaアプリケーションをより順応性と管理しやすくする。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、