Javaでのマルチスレッドの説明[例を挙げて]
公開: 2021-06-15目次
Javaのスレッド
Javaのスレッドは、プログラムの効率的な操作を支援します。 プロフォーマの実行の2つの基本単位は、プロセスとスレッドです。 プロセスは、アプリケーション、プログラム、または自己完結型の実行環境である可能性があります。
一方、スレッドはプロセスのリソースとリソースを共有し、それとともに存在します。 メインスレッドと呼ばれるすべてのJavaアプリケーションには、少なくとも1つのスレッドが存在します。 メインスレッドから複数のスレッドを作成できます。 Javaでスレッドを作成する方法の詳細をご覧ください。
Javaスレッドの利点
- プロセスと比較して、スレッドの作成に必要な時間とリソースが少なくて済みます。 したがって、スレッドは軽量プロセスとも呼ばれます。
- 親プロセスのデータとコードはスレッドによって共有されます。
- スレッド間の相互通信は、プロセス内の相互通信に比べて簡単です。
- Javaのスレッドは、java.langの実装を通じて作成できます。 実行可能なインターフェイス。
シングルスレッド
プログラムにはいくつかの処理装置があり、そのうちの最小のものはシングルスレッドと呼ばれます。 「スレッドクラス」を使用することにより、Javaはスレッドを適用します。 2種類のスレッドが存在します。 デーモンスレッドとユーザースレッド。
アプリケーションをクリーンアップする場合、デーモンスレッドが使用されます。 アプリケーションのバックグラウンドで実行されます。 アプリケーションが最初に起動したときにユーザースレッドが作成されます。
シングルスレッドの利点:
- システムで単一スレッドの実行が発生するため、アプリケーションのオーバーヘッドが削減されます。
- シングルスレッドを使用することで、アプリケーションのメンテナンスコストが削減されます。
Javaでのマルチタスク
マルチタスクとは、CPUが一度に複数のタスクを実行するプロセスを指します。 場合によっては、ユーザーがタスク間でCPU切り替えを実行して、各プログラムと共同作業を行うことがあります。 マルチタスクでは、個別のメモリとリソースがプロセスに割り当てられます。 2つの方法で、マルチタスクを実現できます。
1.マルチプロセッシング(プロセスベースのマルチタスク)
- プロセスごとに個別のメモリ領域が割り当てられます。 したがって、メモリ内の各プロセスのアドレスがあります。
- プロセスは重いです。
- プロセス間の通信コストは高くなります。
- プロセスの切り替えには時間がかかります。 これは、リスト、メモリマップなどを更新するために必要です。
2.マルチスレッド(スレッドベースのマルチタスク)
- 同じアドレスがスレッド間で共有されます。
- スレッドは軽量です。
- スレッド間の通信コストは低くなります。
マルチスレッドとは何ですか?
プログラム内で2つ以上のスレッドが同時に実行される場合、そのメカニズムはマルチスレッドと呼ばれます。 1つのプロセスで多数のスレッドが作成され、計算能力が向上します。 プログラムの2つ以上の部分は、CPUの最大使用率につながる方法で実行されます。
スレッドは、プログラムの個々の部分と呼ばれます。 アプリケーションのプロセスには、複数のスレッドまたは単一のスレッドを含めることができます。
アプリケーションの複数のスレッドは、Java仮想マシンによって許可されます。 すべてのスレッドには独自の優先順位があります。 したがって、優先度の低いスレッドよりも優先度の高いスレッドが優先されます。
マルチタスクを実現するために、マルチスレッドとマルチプロセッシングの両方のプロセスが使用されます。 共有メモリ領域はマルチスレッドで使用されるため、主にマルチプロセッシングで使用されます。 メモリの追加割り当てが不要なため、メモリが節約されます。 さらに、スレッド間でコンテキストスイッチングが発生するため、かかる時間はマルチプロセッシングよりも短くなります。
アニメーション、ゲームでは、 Javaマルチスレッドが使用されます。 Javaのアーキテクチャとコンポーネントについて詳しく知りたい場合は、ここをクリックしてください。
スレッドの作成には、2つのメカニズムを使用できます。
1.スレッドクラスの拡張
2.実行可能なインターフェイスの実装
スレッドクラスと実行可能なインターフェイス
- Javaでは多重継承がサポートされていないため、「スレッドクラス」を拡張しても他のクラスを拡張することはできません。 ただし、インターフェース「Runnable」の実装により、他の基本クラスをクラスから拡張できます。
- スレッドの基本機能は、interrupt()、yield()などの組み込みメソッドが提供されているため、Threadクラスを拡張することで拡張できます。
- runnableを使用すると、複数のスレッドが共有できるオブジェクトが提供されます。
Javaスレッドクラス
Javaでのスレッドプログラミングは、スレッドクラスを介して実現されます。 コンストラクターは、スレッド操作を実行するためのスレッドクラスとメソッドによって提供されます。 スレッドクラスは、実行可能なインターフェイスを実装し、Objectクラスを拡張します。
使用されるいくつかの一般的なスレッドメソッドは次のとおりです。
- start():スレッドの実行はこのメソッドによって開始されます。 run()メソッドはJVMによって呼び出されます。
- sleep(intミリ秒):スレッドの実行は、このメソッドを介してスレッド化プロセスがスリープ状態になるときに提供されるミリ秒の間一時停止されます。 一時停止後、スレッドの実行が再開されます。 このメソッドを使用して、スレッドを同期できます。
- getName():スレッド名はこのメソッドを介して返されます。
- setPriority(int new priority):スレッドの優先度はこのメソッドを介して変更されます。
- yield():現在のスレッドは、このメソッドによる他のスレッドの実行とともに停止します。
- run():このメソッドは、スレッドでアクションを開始するためのものです。
- getPriority():スレッドの優先度は、このメソッドを使用して返されます。
- setName():スレッド名はこのメソッドを介して変更されます。
- getId():スレッドIDはこのメソッドを介して返されます。
- suspend():スレッドはこのメソッドによって中断されます。
スレッドのライフサイクル
スレッドのライフサイクルにはさまざまな段階があり、以下にリストされています。
- 新規:この段階でスレッドを作成するために「スレッドクラス」が使用されます。 スレッドが開始されるまで、プログラムはこの段階にとどまります。 このメソッドは、ボーンスレッドとも呼ばれます。
- 実行可能: startメソッドは、スレッドライフサイクルのこの段階でスレッドインスタンスを呼び出します。 スケジューラーは、実行を終了するためにスレッドの制御を引き継がれます。 スレッドを実行するかどうかは、スケジューラーによって異なります。
- 実行中:スレッドの実行が開始されると、ステージは「実行中」のステージに移行します。 スケジューラーはスレッドのプールから1つのスレッドを選択し、アプリケーションの実行を開始します。
- 待機中:名前が示すように、ライフサイクルのこのフェーズでは、スレッドは待機します。 アプリケーションで複数のスレッドを実行するため、スレッドの同期は不可欠です。 したがって、他のスレッドの実行が終了するまで、スレッドが待機する必要があります。 したがって、ライフサイクルの段階は待機段階とも呼ばれます。
- デッド:スレッドの終了が発生するステージは、「デッド」ステージと呼ばれます。 スレッドが実行中から処理の終了まで転送されると、スレッドは終了するため、「デッド状態」になります。
Javaでのスレッド同期
マルチスレッドの場合、プログラムで非同期動作が発生します。 おそらくデータが1つのスレッドを介して書き込まれ、データの読み取りが別のスレッドによって同時に実行される場合、アプリケーションに不整合が生じる可能性があります。
スレッド間で共有されるリソースは、他のスレッドからアクセスする必要があります。 したがって、そのような場合、同期のアプローチにアプローチします。 同期されたメソッドは、同期動作を実現するためにJavaで使用できます。
スレッドが同期ブロックに到達すると、到達すると、同じオブジェクト上の他のスレッドからメソッドを呼び出すことはできません。 スレッドがブロックの実行を終了してブロックを終了するまで、他のスレッドは停止して待機する必要があります。
世界のトップ大学からオンラインでソフトウェアコースを学びましょう。 エグゼクティブPGプログラム、高度な証明書プログラム、または修士プログラムを取得して、キャリアを早急に進めましょう。
マルチスレッドの利点
- 複数の操作を同時に実行できます。 独立したスレッドが実行されている場合、ユーザーはブロックされません。
- 複数の操作を同時に実行するため、時間が節約されます。
- スレッドは独立しているため、別のスレッドの影響を受けることはありません。 1つのスレッドで例外が発生しても、他のスレッドの実行には影響しません。
マルチスレッドの例
Javaでのマルチスレッドプログラムの例を以下に示します。
ソース
図1:マルチスレッドコード例のスニペット
コードの説明
3行目:クラス「GuruThread1」はrunnableを実装しています。
8行目:クラスのmainメソッドを表示します。
9行目:スレッドクラスがインスタンス化され、インスタンス「guruThread1」が作成され、スレッドが作成されます。
10行目:「Threadclass」がインスタンス化され、インスタンス「guruThread2」とスレッドが作成されます。
11行目:guruThread1という名前のスレッドが開始されます。
12行目:guruThread2という名前のスレッドが開始されます。
13行目:「スレッド名は次のとおりです:」というテキストが出力されます。
14行目:メソッドgetName()を使用してthread1名を取得します。
15行目:メソッドgetName()を使用してthread2名を取得します。
上記のコードを実行すると、次の出力が得られます。
ソース
図: Javaのマルチスレッドプログラムから生成された出力のスクリーンショット(
結論
この記事では、Javaでのマルチスレッドの概念と、Javaでのマルチスレッドプログラムの例について説明しました。 あなたの学習はここで止まらず、Javaの他のすべての基礎概念とうまくやっていくことができます。
手頃な価格でプログラミングスキルを習得し、業界に対応できるようにすることに興味がある場合は、upGradの「コンピュータサイエンスの理学修士」が提供するコースを確認できます。 21〜45歳の年齢層のすべての中堅専門家を対象としています。 このコースは、リバプールジョンムーア大学によって認定されており、500時間以上の学習、309のプロジェクト、およびあなたを最大限に活用するための課題で設計されています。 ご不明な点がございましたら、メッセージをお送りください。チームからご連絡いたします。