ホームページ  >  記事  >  Java  >  Java でスレッドを実装するにはどうすればよいですか? Javaスレッドの実装方法(画像とテキスト)

Java でスレッドを実装するにはどうすればよいですか? Javaスレッドの実装方法(画像とテキスト)

不言
不言オリジナル
2018-09-17 15:18:242056ブラウズ

この記事の内容は、Java でスレッドを実装する方法についてです。 Java スレッドの実装方法 (画像とテキスト) は、必要な友人に参考にしていただければ幸いです。

プロセスとスレッド

従来のオペレーティング システムでは、中心的な概念は「プロセス」であり、プロセスは実行中のプログラムを抽象化したものです。
プロセスの存在により、オペレーティング システムでは複数のプロセスの実行が許可され、これらのプロセスが同時に実行されているように見えます。
私たちのコンピュータが Web ブラウザ、電子メール クライアント、QQ WeChat などのインスタント メッセージング ソフトウェアなどの複数のプロセスを実行している場合、これらのプロセスはすべて同時に実行されているように感じられます。 CPU またはマルチコア CPU の場合、複数のプロセスが並列するこの現象は、各プロセスに個別の CPU を割り当てることができるため、マルチプロセスの並列処理を実現できます。
しかし、実際には、コンピューターに CPU が 1 つしかない場合、人間は複数のプロセスが同時に実行されているように感じることもあります。しかし、人間の感情は曖昧で不正確なものが多いです。実際、CPU の計算速度は非常に速いため、CPU はある時点では 1 つのプロセスしか実行できませんが、1 秒以内にプロセスをすばやく切り替えることができるため、ユーザーはプロセスを切り替えることができます。複数のプロセスが同時に実行されているような錯覚を引き起こします。
オペレーティング システムでは、スレッドという概念がプロセスから派生したのはなぜですか?

  1. 一部のプロセスでは、その内部で複数のアクティビティが発生するため、これらのアクティビティがスレッドによって分離されている場合、一部のアクティビティは特定の時点でブロックされない可能性があります。並列実行すると、プログラムの設計が容易になります。

  2. スレッドはプロセス作成よりも軽量で、パフォーマンスの消費が少なくなります。

  3. プロセスが CPU 計算と I/O 処理の両方を必要とする場合は、複数のスレッドを使用します。スレッドを使用すると、これらのアクティビティを重複させることができ、プロセス全体の実行が高速化されます。

各プロセスは、オペレーティング システム内に独立したメモリ アドレス空間を持ちます。マルチスレッドをサポートするオペレーティング システムでは、プロセスによって作成されたすべてのスレッドがこのメモリを共有します。 CPU スケジューリングの最小単位。 CPU タイム スライスは、異なるスレッド間で分割されます。

スレッドの可能な実装方法

基本的に、主流のオペレーティング システムはスレッドをサポートし、スレッド実装も提供します。さまざまなハードウェアやオペレーティング システムの違いに対処するために、Java 言語ではスレッド操作の統一された抽象化が提供され、スレッドを表すために Thread クラスが使用されます。
Thread の特定の実装には、さまざまな実装方法がある場合があります。

カーネル スレッド実装を使用する

カーネル スレッドは、オペレーティング システムのカーネルによってサポートされるスレッドです。カーネルにはスレッド テーブルがあります。 for システム内のすべてのスレッドを記録します。スレッドを作成または破棄するときにシステム コールが必要となり、カーネル内でスレッド テーブルが更新されます。カーネル スレッドのブロックやその他の操作にはすべてシステム コールが関係し、システム コールは比較的高価であり、ユーザー モードとカーネル モードの間の切り替えが必要になります。さらに、カーネル内にはスレッド スケジューラがあり、CPU タイム スライスをどのスレッドに割り当てるかを決定します。
プログラムは通常、カーネル スレッドを直接操作せず、カーネル スレッドの高レベル インターフェイス、つまり軽量プロセスを使用します。軽量プロセスとカーネル スレッドの関係は 1:1 であり、各軽量プロセスはカーネル スレッドによってサポートされます。

Java でスレッドを実装するにはどうすればよいですか? Javaスレッドの実装方法(画像とテキスト)

上の図では、LWP は軽量プロセス (軽量プロセス) を指し、KLT はカーネル レベル スレッド (カーネル スレッド) を指します。

ユーザー スレッドを使用して実装する

ユーザー スレッドは、プログラムまたはプログラミング言語によって実装されるスレッド ライブラリです。システム カーネルは、これらのスレッドの存在を感知できません。ユーザー スレッドの確立、同期、破棄、スケジューリングはすべて、カーネルの助けやシステム コールを必要とせずにユーザー モードで完了します。この利点は、スレッドの操作が非常に効率的であることです。この場合、プロセスとユーザー スレッドの比率は 1:N です。

Java でスレッドを実装するにはどうすればよいですか? Javaスレッドの実装方法(画像とテキスト)

ユーザー モード スレッドは、スレッドをブロックする方法に直面すると困難に直面します。ユーザー モード スレッドをブロックすると、マルチスレッド処理全体もブロックされます。意味が失われます。カーネルのサポートがないため、スレッドのブロックとウェイクアップ、マルチ CPU 環境でのスレッド マッピングなど、カーネルの使用を必要とする多くのタスクはユーザー プログラムで実装する必要があり、これは非常に困難な場合があります。実装する。

ユーザー スレッドとカーネル スレッドの混合実装を使用する

この混合実装では、ユーザー スレッドとカーネル スレッドの両方が存在します。ユーザー モード スレッドの作成と切り替えの操作は依然として非常に効率的であり、ユーザー モードで実装されたスレッドにより、スレッドのサイズを簡単に増やすことができます。オペレーティング システム カーネルからのサポートを必要とする機能は、さまざまなプロセッサへのマッピング、処理スレッドのブロックとウェイクアップ、カーネル スレッドのスケジューリングなど、カーネル スレッドを通じて実装されます。この実装でも、ユーザー スレッドとカーネル スレッド間のブリッジである軽量プロセス LWP が使用されます。

Java でスレッドを実装するにはどうすればよいですか? Javaスレッドの実装方法(画像とテキスト)

Java スレッドの実装

JDK1.2 より前では、Java スレッドはユーザー スレッドを使用して実装されていました。つまり、Java は、オペレーティング システムによってネイティブにサポートされているスレッド モデルを使用して実装されています。Java スレッド モデルの実装は、主にオペレーティング システムに依存します。 Oracle JDK の場合、Windows および Linux 上のスレッド モデルは 1 対 1 の方法で実装されます。つまり、Java スレッドが軽量プロセス (カーネル スレッド) にマップされます。 Solaris プラットフォームでは、Java は 1:1 および N:M スレッド モデルをサポートします。

スレッドのブロックと待機中

Java のスレッドのステータスは次のとおりです: 新規、実行可能、待機中、時間待機中、ブロック済み、終了。

Java でスレッドを実装するにはどうすればよいですか? Javaスレッドの実装方法(画像とテキスト)

  • NEW: スレッドは最初に作成されましたが、実行されていません

  • RUNNABLE:スレッドは実行中ですが、必ずしも CPU を消費しているわけではありません

  • BLOCKED: スレッドは別のスレッドがロックを解放するのを待っています

  • WAITING: スレッドはwait、join、LockSupport.park() メソッドを実行しました

  • TIMED_WAITING: スレッドは、sleep、wait、join、LockSupport.parkNanos() および他のメソッドを呼び出します。WAITING 状態とは異なります。メソッドには表現時間パラメータがあります。

ブロックと待機の重要な違いは、ブロック (ブロック) 状態のスレッドは排他ロックの取得を待機していることです。たとえば、スレッドはクリティカル セクションに入るのを待機しています。 synchronized キーワードで囲まれると、ブロック状態になります。待機状態は、起動されるのを待っている状態、または一定期間待機している状態です。

以上がJava でスレッドを実装するにはどうすればよいですか? Javaスレッドの実装方法(画像とテキスト)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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