プログラミングアーキテクチャ(05):Javaマルチスレッド同時実行

この記事のソースコード:GitHub・ここをクリック|| GitEE・ここをクリック

1つのマルチスレッドマップ

プログラミングアーキテクチャ(05):Javaマルチスレッド同時実行

2.マルチスレッドの基本

1.基本的な概念

スレッドは、オペレーティングシステムが操作スケジューリングを実行できる最小の単位であり、プロセスに含まれ、プロセスの実際の操作単位です。スレッドとは、プロセス内の単一の順次制御フローを指します。プロセス内で複数のスレッドを同時に実行でき、各スレッドは異なるタスクを並行して実行します。

2.作成方法

Threadクラスを継承し、CallableおよびFutureインターフェイスに基づいてRunnableインターフェイスを実装します。また、Timerはバックグラウンドスレッドおよびスレッドプールです。

3.スレッドステータス

プログラミングアーキテクチャ(05):Javaマルチスレッド同時実行

状態の説明:初期状態、実行状態、ブロッキング状態、待機状態、残業待機状態、および終了状態。

4.実行メカニズム

プログラミングアーキテクチャ(05):Javaマルチスレッド同時実行

JVM内のアプリケーションは、複数のスレッドによって並行して実行できます。スレッドは、サービスが配置されているオペレーティングシステムスレッドに1対1でマップされ、使用可能なCPUで実行されるようにスケジュールされ、起動時にオペレーティングシステムスレッドが作成されます。スレッドが終了すると、これが行われます。オペレーティングシステムのスレッドもリサイクルされます。

5.メモリモデル

プログラミングアーキテクチャ(05):Javaマルチスレッド同時実行

仮想マシンが起動して実行されると、複数のスレッドが作成されます。データ領域の一部のモジュールはスレッドによって共有され、一部はプライベートです。

スレッド共有:メタデータ領域、ヒープ;

スレッドプライベート:仮想マシンスタック、ローカルメソッドスタック、プログラムカウンター。

単一のCPUは特定の瞬間に1つのスレッドしか実行できないため、複数のスレッドは複数のスペースブロックを使用し、CPUの実行期間を常に競合します。

3つの一般的な概念

1.スレッドの優先度

スレッドスケジューラは、スレッドの優先度が高いスレッドを実行する傾向があります。スレッドの優先度が高いと、CPUリソースを取得する可能性が高いか、取得した実行時間フラグメントが高く、実行される可能性が高いことを示しますが、優先度の低いものを最後に実行する必要があるわけではありません。

2.デーモンスレッド

デーモンスレッドは、主にプログラムでスケジューリングとサポートの役割を果たす補助スレッドをサポートします。Jvm内のすべての非デーモンスレッドが終了すると、デーモンスレッドも終了します。

3.スレッド結合

スレッドAで、スレッドBの結合メソッドを実行すると、スレッドAはスレッドBの実行が終了するのを待ってから、実行を続行します。

4.ローカルスレッド

ThreadLocalは、スレッドローカル変数とも呼ばれ、各スレッドに変数のコピーを作成します。各スレッドは独自の内部コピー変数にアクセスでき、スレッドは相互に影響を与えません。

第四に、糸の安全性

上図のスレッドとメモリスペースの占有状況の観点から、スレッドが共有メモリブロックにアクセスするときのスレッドの安全性を確保する必要があります。

1.同期制御

同期されたキーワード同期制御、メソッドの変更、コードブロックの変更、静的メソッドの変更などが可能で、同期制御リソースが少なく、マルチスレッドの効率を向上させることができます。

2.ロック機構

ロックインターフェイス:Javaコンカレントプログラミングでのリソースロックのルートインターフェイスの1つで、リソースロックのいくつかの基本的な方法を指定します。

ReentrantLockクラス:Lockインターフェイスを実装する再入可能ロック。つまり、スレッドが現在のインスタンスのロックを取得してタスクメソッドに入ると、ロックを解放せずにタスクメソッドに再び入ることができます。機能:相互除外、つまり一度に1つのスレッドのみがタスクに入ります。

条件インターフェイス:ロックに関連付けられる可能性のある条件変数を記述し、より強力な機能を提供します。たとえば、Conditonは、スレッド待機/通知メカニズムで複数の通知と選択的通知を実装できます。

3.揮発性キーワード

Volatileはメンバー変数を変更し、メソッドを変更できません。つまり、スレッドがこの変数にアクセスするときに、共有メモリから取得する必要があります。変数への変更も共有メモリに同期的にフラッシュして、すべてのスレッドに変数が表示されるようにする必要があります。

5、スレッド通信

スレッドは独立したエンティティですが、スレッドの実行プロセスで同じビジネスロジックが処理されると、リソースの競合が発生し、同時実行の問題が発生したり、デッドロックが発生したりする可能性があります。スレッド間の調整には、保証する通信メカニズムが必要です。

1.基本的な方法

関連するメソッドはJavaのオブジェクトレベルの基本メソッドであり、どのオブジェクトにも次のメソッドがあります。notify()は、オブジェクトを待機しているスレッドにランダムに通知して、待機状態を終了して戻ります。wait()スレッドは待機状態になりますが、待機状態にはなりません。ロックオブジェクトを求めて競合するため、待機時間を設定することもできます。

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

待機/通知メカニズムこのモードでは、スレッドAはオブジェクトwait()メソッドを呼び出して、タスクの実行が満たされないときに待機状態に入ります。スレッドBは、スレッドAの実行条件を変更し、オブジェクトのnotify()またはnotifyAll()メソッドを呼び出します。 、スレッドAは、通知を受信した後、待機状態から戻り、後続の操作を実行します。2つのスレッドは、オブジェクトによって提供されるwait()/ notify()/ notifyAll()を介して、待機と通知の間の対話を完了します。これにより、プログラムのスケーラビリティが向上します。

3.パイプラインフロー通信

パイプラインフローは、主に異なるスレッド間でデータを直接転送するために使用されます。一方のスレッドはデータを出力パイプに送信し、もう一方のスレッドは入力パイプからデータを読み取ることで、異なるスレッド間の通信を実現します。

6、スレッドプール

1.エグゼキュータインターフェイス

Executorシステムでは、スレッドタスクの送信とタスクの実行が分離されるように設計されています。Executorには、タスクを送信してタスクの実行結果を取得し、タスクの実行プロセスをカプセル化する便利な方法を提供するさまざまな強力な実装クラスがあり、不要になります。 Thread()。start()メソッドは、明示的にスレッドを作成し、それらに関連付けられたタスクを実行します。

2.コアパラメータ

プログラミングアーキテクチャ(05):Javaマルチスレッド同時実行

3.関連するAPIクラス

プログラミングアーキテクチャ(05):Javaマルチスレッド同時実行

スレッドプールタスク:コアインターフェイス:実行可能、呼び出し可能インターフェイス、およびインターフェイス実装クラス。

タスクの結果:インターフェイスFutureおよび実装クラスFutureTask;

タスクの実行:コアインターフェイスExecutorおよびExecutorServiceインターフェイス。Executorフレームワークには、ExecutorServiceインターフェイスを実装する2つのコアクラス、ThreadPoolExecutorとScheduledThreadPoolExecutorがあります。

7つの共通スレッドAPI

1.フォーク/結合メカニズム

Fork / Joinフレームワークは、タスクを並行して実行するために使用されます。コアアイデアは、大きなタスクを複数の小さなタスクに分割し、各小さなタスクの実行結果を要約して、大きなタスクの最終結果を取得することです。コアプロセス:分割タスク、モジュールタスクの非同期実行、および単一タスクの結果のマージ。

2.コンテナ

ConcurrentHashMap:セグメントロックメカニズムを使用して、コンテナ内のデータをセグメントに分割してセグメントに格納し、データの各セグメントにロックを割り当てます。スレッドがロックを占有してデータの1つのセグメントにアクセスすると、他のセグメントのデータを他のセグメントでも使用できます。セキュリティと実行効率の両方を考慮したスレッドアクセス。

ConcurrentLinkedQueue:***リンクノードに基づくスレッドセーフキュー。FIFOの原則に従って要素を並べ替えます。キューの先頭はキュー内の時間が最も長い要素であり、キューの末尾はキュー内の時間が最も短い要素です。要素はキューの最後に追加され、要素の取得操作はキューの先頭から取得されます。

3.アトミック

JDKには、基本タイプ、配列タイプ、参照タイプ、属性変更タイプなど、複数のスレッドによる変数の同時操作を処理するアトミック操作クラスが付属しています。

8つのアプリケーションシナリオ

1.時限タスク

構成設定により、一部のプログラムは指定された時点またはサイクル時間で定期的に実行されます。ここでのタスクの実行は、マルチスレッドテクノロジーに基づいています。

2.非同期処理

非同期処理とは、現在の同期コードブロックに従ってプログラムが実行されないことを意味します。非同期処理と同期処理は逆です。非同期の実現には、プログラムの効率を向上させるために複数のスレッドまたは複数のプロセスも必要です。

3.タスクの分解

分散データベースでの一般的な操作データは異なるデータベースのコピーで分散されますクエリを実行する場合、各サービスはクエリタスクを実行し、最後に1つのサービスでデータをマージするか、集約用の中間エンジンレイヤーを提供する必要がありますデータ、大規模なタイミングタスクでは、処理されるタスクは特定の戦略に従って断片化されることが多く、複数のスレッドが同時に処理されます。

4.接続プールテクノロジー

接続のバッファプールを作成および管理するテクノロジであるこれらの接続は、接続を必要とするすべてのスレッドですぐに使用できるため、接続の継続的な作成と解放の問題が軽減され、プログラムの効率が向上します。

9、ソースコードアドレス

GitHub·地址
https://github.com/cicadasmile
GitEE·地址
https://gitee.com/cicadasmile

推奨読書:仕上げプログラミングシステム

シリアルナンバー プロジェクト名 GitHubアドレス GitEEアドレス 推奨
01 Javaは、設計パターン、アルゴリズム、およびデータ構造を記述します GitHub・ここをクリック GitEE・ここをクリック ☆☆☆☆☆
02 Javaの基盤、並行性、オブジェクト指向、Web開発 GitHub・ここをクリック GitEE・ここをクリック ☆☆☆☆
03 SpringCloudマイクロサービスの基本コンポーネントケースの詳細な説明 GitHub・ここをクリック GitEE・ここをクリック ☆☆☆
04 SpringCloudマイクロサービスアーキテクチャの包括的なケース GitHub・ここをクリック GitEE・ここをクリック ☆☆☆☆☆
05 SpringBootフレームワークの基本的なアプリケーションから高度なものまで GitHub・ここをクリック GitEE・ここをクリック ☆☆☆☆
06 SpringBootフレームワークは、一般的なミドルウェアを統合および開発します GitHub・ここをクリック GitEE・ここをクリック ☆☆☆☆☆
07 データ管理、配布、アーキテクチャ設計の基本的なケース GitHub・ここをクリック GitEE・ここをクリック ☆☆☆☆☆
08 ビッグデータシリーズ、ストレージ、コンポーネント、コンピューティング、その他のフレームワーク GitHub・ここをクリック GitEE・ここをクリック ☆☆☆☆☆   

おすすめ

転載: blog.51cto.com/14439672/2539837