プログラマ:詳細な[バージョン]に基づいて、複数の並行スレッド

このブログの猫おじさんのブログは、再現、ソースを明記してください

「15分」については、この記事を読みます

フィットネス群衆の読み取り:Javaの主

研究ノート

基本的な考え方

スレッドはどこにでもあります

私たちはそれのいくつかの基本的な考え方についてお話しましょう

プロセスは、複数のスレッドが、メモリやファイルハンドルとして、プロセス内の同じスレッドに等をアプリケーション・プロセスのリソースを共有含むことができ

JVMスレッドの観点から成分(コンポーネント)プロセスであります

コードのどの部分でのJavaプログラムは、常に特定のスレッドで実行されます

デーモンスレッド(デーモンスレッド)とユーザスレッドへのJavaスレッド(ユーザスレッド)

ユーザースレッド:アプリケーションが完了する前に、JVMの通常の停止、すべてのユーザー・スレッドは、JVMが停止することはできませんそれ以外の場合は、停止しなければなりません

デーモンスレッド:JVMは通常、いくつかの重要なタスクを実行するために、通常の停止には影響しないが、そのような他のスレッドの動作を監視として、高くありません

スレッドは、パフォーマンスの問題に関連して実装、スレッドの安全性に責任があるとそれによって、マルチスレッド実行すると、我々は、コードの各セグメントに注意を払う必要があります

System.out.println("The ** method was executed by thread: " + Thread.currentThread().getName());
复制代码

あなたは、対応するメソッドが実装を担当しているスレッド見ることができるように、もちろん、あなたは新しいスレッドで新しいイノベーションを通すことができ、あなたの推測を確認する責任があります

画像

作成と実行

Javaでは、スレッドインスタンスはjava.lang.Threadのです

Threadクラスを作成し、JVMは、このスレッドインスタンス所望のコンテンツ空間に2つのコールスタックを(コールスタック)が割り当てられます

2つのコールスタック、Javaコードとの間の関係を追跡するためのコール1、ネイティブコードの間の関係を追跡するために他のを呼び出すためのJavaコード(すなわちネイティブコード)

私たちは、メインメソッドで新しいスレッドを作成すると、新しいスレッドが親子関係のスレッドであるメインスレッドの子スレッドであり、

デーモンスレッドとしてデフォルトの親スレッドによって、子スレッドもデーモンで、ユーザスレッドが真である、もちろん、あなたもは、setdaemon法により、この属性を変更することができます

国家とコンテキストスイッチング

この生命状態の多くの人々がありますが、スレッドは同じです

私たちは、getStateをメソッドを介して取得することができ、戻り値は、列挙型(列挙型)であります

状態 リマーク
新着 そして、一度だけ、この状態では、だけではない始めたスレッドを作成
RUNNABLE READYは、JVMスレッドスケジューラスケジュールRUNNING状態に移行するときの複合状態は、READYおよび実行を含む、RUNNING、すなわちインスタンス収率メソッドが呼び出されたときに実行されるCPUによって使用される実行方法コード、またはスレッドスケジューラ理由、RUNNINGまた、スレッドが実行中であることを示しそれはREADYに切り替わります
BLOCKED スレッドのI / O操作や、別のスレッドが保持しているロックを獲得しようとする試みを開始した後で、実行可能状態に上記の操作後、CPUリソースを占有されることはありません状態に入ります
WAITING 特定の方法を行う(はObject.wait()、Thread.join()、LockSupport.park())は、特定の動作状態を実行する他のスレッドのための無限の待ち時間であり、いくつかの方法(Object.notify()、Object.notifyAll()、 LockSupport.unpark(スレッド)RUNNABLEのを待ってから移行するスレッド
TIMED_WAITING 特定の操作を実行するために他のスレッドを待っているの制限時間内に、他のスレッドの実行と、タイムアップし、それが自動的にRUNNABLEに変換されます
TERMINATED スレッドの最後の実施状況、および一度だけ、関係なく、成功または異常の

そして、RUNNABLEからのスレッドは、プロセスTIMED_WAITINGコンテキストでブロックされ、WAITING、いくつかの州スイッチング手段(コンテキストスイッチ)に変換しました

コンテキスト情報:CPUレジスタの内容及び時点でのプログラムカウンタなどを含みます

あなたはにいると私の両親を呼び出して、突然で再生するにはあなたのガールフレンドの場合は、決定的予定の招待ガールフレンドをピックアップして、ここで親を再接続し、ちょうどチャットの内容を継続します

(チャット)他のコンテキスト情報にRUNNABLEを格納する必要があり、その後、再入力RUNABLE状態、コンテクスト情報以前に格納された返信スレッド(チャット)、その過程で返信を保存すると、コンテキストスイッチであります

保存や復元などCPU時間とCPUキャッシュ無効化コンテンツとして、間接費の必要性があります

窓がパフォーマンスモニタを所有してあなたは、コンテキストスイッチが実行されている彼らのJavaプログラムに起こる、私の側はwin7のある時に見ることができます

画像

画像

Linuxはまた、PERFコマンドを表示するために使用することができます

perf stat -e cpu-clock,task-clock,cs,cache-references,cache-misses java 你的程序名
复制代码

ラインモニタ

私たちは、知られてしまう不明を配置する必要があり、ブラックボックスホワイトボックス

あなたは、JDK自体jvisualvmモニタリングを使用しようとすることができます

画像

またはJMCもOK

画像

賛否両論

実際には、我々はこのの基本的な理解を持っているので、私はして詳細に入るつもりはありません

優位 恵まれません
システムのスループットを提供 スレッド安全性の問題
応答性を向上 バイタル質問スレッド
マルチコアCPUを最大限に活用 コンテキストスイッチング
システムリソースの使用を最小限に抑えます 確実
構造簡素化の手順 /

バイタルサインについては、複数のロックを必要とするかもしれません

デッドロック(デッドロック):独自のロックを持っていますが、それはロックの反対側にあります

T1(L1) 等 L2
T2(L2) 等 L1
复制代码

ライブロック(ライブロック):スレッドが(クラッシュの一部、同様の????を舐め犬として、彼女はこのアナロジーは、私の妻と説明した後、私の第一印象で与えた)行動をしようとしたが無駄にされています

スレッド不足(飢餓):READYサブ状態は常にRUNNABLEの状態で、CPUを実行するチャンスを得ることはありません。

関連用語

用語 説明
タスク(タスク) タスクは、実行する必要がスレッドです一から一ではない、タスクファイルである概念であり、複数のデータファイルも作業になる場合があります
並行性(並行) 順次よりも、同じ期間内に複数のタスクを実行する、交互に行います
パラレル(並列) 同時に複数のタスクを実行します
クライアントスレッド(クライアントスレッド) Helloクラスがあり、それは()と言う、そして主な機能、エンティティクラスを作成し、それがメソッドを呼び出すと言う独自のメソッドを持って、その後、Helloクラスのために、クライアント・スレッドは、メインスレッドがあります
ワーカースレッド(ワーカースレッド) Helloクラスがあり、それは、独自のメソッドを持っている独自のWorkThreadに初期化中にスレッドを持っている、()と言う、スレッドは、独自のログを実行するために、ほぼ同様始めるようになった、その後、ワーカースレッドは、スレッドWorkThreadです
コンテキストスイッチング 上記の記事の内容を表示するには:)
ディスプレイのロック すべてのクラスおよびインタフェースを同期含むロックを制御することができるJavaコードjava.util.concurrent.locks.Lock
スレッドセーフ 共有データ操舵コードは、その正しさを維持し、同時に確実にするために複数のスレッドで実行することができます

私は付録に同期して揮発性、次回としましょう。

私自身は、まだ関連の知識と学習技術のプロダクトマネージャーに準拠し、私はこれがあなたに新しい知識を持って来ることを願って。

公開番号:Javaの猫が言いました。

学習交換基:728 698 035

今アーキテクチャ(コード農家)とビジネステクノロジーコンサルタント、平凡な奔放、オープンソース、生活や予定外のドライトーク番組が大好きです。

イメージテキスト

おすすめ

転載: juejin.im/post/5d875089e51d4561d044cda1