JAVA並行プログラミング----スレッドごと、スレッド間の共有と業務

まず、基本的な概念  

1.プロセスとスレッドとは何ですか

プロセスは、リソース割当ての最小単位のオペレーティングシステムであり、次の工程は、複数のスレッドを持つことができ

スレッドは、 CPUスケジューリングの最小単位であり、プロセスから独立して存在しないことができ、プロセスは、リソースを共有することができます

スレッドとコアの関係2.CPU番号

一般に、コアの--cpu番号:= 1スレッドの数:1

後インテル参照ハイパースレッディング= 1:2

3.CPU時間回転機構

並行プログラミングCPUタイムスライス回転機構(RRスケジューリング)_Java_タン青海-CSDNブログ

4.並列並行

パラレル:タスクの数は、実行中

例:2あれば人にサービスを提供することのできるコーヒーマシン、それは、並列の数である、それは、並列の数である2

同時実行:タスクの数を実行することができる時間の期間

例えば:コーヒーマシン10分では、コーヒーの2杯を生成することができ、我々は2の10分以内に、同時並行の数を考慮することができます

思考:JAVAなぜ並行プログラミングの導入

1. CPUリソースをフルに活用します。

2.ユーザー応答時間を早めます。

第二に、Javaスレッドで理解

スレッド内のJAVAは、コラボレーションを先取りされていません

プログラム内の1.javaは本質的にマルチスレッド化され、その後、いくつかの方法があり、新しいスレッドを開始?

我々はそれを証明するように、Javaは、本質的にマルチスレッドであるのはなぜ

パブリック静的無効メイン(文字列[] args){

// Java仮想マシンのスレッドシステムの管理インタフェース

    ThreadMXBeanthreadMXBean = ManagementFactory.getThreadMXBean()。

//唯一のスレッドとスレッド・スタック情報を取得

    ThreadInfoに[] threadInfos = threadMXBean.dumpAllThreads(偽、偽)。

{(threadInfos ThreadInfoにThreadInfoに)のために

System.out.println( "[" + threadInfo.getThreadId()+ "]" + threadInfo.getThreadName())。

}

}

実行した後、我々は我々のスレッドに多くの情報を印刷するには、コンソール上で見つけます(スレッド情報は、情報だけではなく、ポイントのためです)

[8] JDWPコマンドリーダー

[7] JDWPイベントヘルパースレッド

[6] JDWP交通リスナー:dt_socketという

[5] ---リスナーを取り付けダンプスレッド情報スレッド

[4]信号ディスパッチャ

[3]ファイナライザ---リサイクル対象スレッド(デーモンスレッド)

[2]参照ハンドラ---基準回復処理スレッド

[1]主---メインスレッドメイン

私たちのJAVAは本質的にマルチスレッドのコラボレーションで説明する私たちのために、スレッドの多くを印刷する唯一の主要な方法

スレッドを開始するには、いくつかの新しい方法

JDKのスレッド・ノートは、ソースコードを提供します

JDKには2つのしか方法がありますを教えてくれる  

(1)スレッドを拡張します   

(2)実装のRunnable

(3)実装呼び出し可能注:呼び出し可能な値が返され、そしてのRunnableと考えることができます

以下は、達成するためのコードです。

パブリッククラスTheadextendsスレッド{

@オーバーライド

    ます。public void実行(){

System.out.printlnは( "スレッドから継承されました");

}

}

パブリッククラスThead1implements Runnableを{

@オーバーライド

    ます。public void実行(){

System.out.println( "实现Runnableを");

}

}

パブリッククラスThead2implements呼び出し可能{

@オーバーライド

    パブリックオブジェクト呼び出し()は、{例外をスロー

「呼び出し可能を実現するために」戻ります。

}

}

我々はスレッドとのRunnableを言うので、それはどのような違いを生むのでしょうか?

1.Theadは、スレッドの抽象化され、そしてRunableは抽象的な作業です

2.リソースの共有に適したクラスの継承スレッド、ない場合。Runableインターフェイスを実装している場合しかし、その後、簡単にリソースを共有しています。

3.main、スレッドオブジェクトのインスタンスは、異なります

スレッドを拡張:t.start();

実装したRunnable:新しいスレッド(T).start();

4. Runnableを、プロセスのロバスト性を増加させる、コードが複数のスレッド、別々のコード及びデータで共有することができ

スレッドプールは直接ではなく、クラスの継承スレッドに、スレッドまたは呼び出し可能なクラスにRunableを達成することができます

2.は非常に、JAVAは、どのようにスレッドセーフストップ、それを作るために、エンドを開始しますか?

ストップ()または割り込み()、isInterruptedを()、静的メソッドは、(中断)=>私たちは、これらの方法を理解する必要があります

現在のスレッドを停止する強制停止()---

私たちは、それは積極的な行動が付属しているので、推奨されていないソースコードスレッドの停止方法は、JDKを教えてくれるショー時代遅れのラベルを、マークされて見ることができ、安全性や資源回収スレッドを保証することはできません

割り込み()---スレッド通知割り込み(実際には、フラグ割り込みスレッドを設定)

私たちはあなたの停留所まで現在のスレッドを伝えるために、のは挨拶私達のスレッドにあると思いますが、強制ブレークするために、自分自身のスレッドを中断するかどうかを決定することはできません

isInterruptedを()---現在のスレッドが中断されたかどうかを決定します 

一般に、スレッドの実行方法にかかわら動作を決定するために使用されます

---)(割り込みフラグにスレッドを中断

また、スレッドが中断されているかどうかを決定するために使用することができますが、trueからfalseにフラグを中断します

*現在のスレッド、Runnableを、上記の方法で設けられていない取得するためのRunnableで使用にThread.currentThread()メソッドを実行する必要

ブロックする方法が例外:InterruptedExceptionをスローすると、スレッドが中断されることはありません*、我々はキャッチで手動で再コール割り込み()メソッドに必要

*デッドロックのスレッドが中断気にしないだろう

Javaスレッドで第三に、もう少し理解

ライフサイクルのスレッド

1.スレッドとスレッドの一般的な方法の状態

)深さでの実行の理解()と(スタート

死の実行後、ビジネスメソッドを実行するスレッドの()メソッドを実行します

レディ状態に()スレッド(実行状態)の開始に割り当てられたCPU時間が実行状態に入ることができる場合、各スレッドは、待機時間スライス回転、一度だけ呼び出されてもよいです

役割の待ち時間は())(待って、同時に、待機状態に現在のスレッドを可能にすることですまた、現在のスレッドは、それが保持しているロックを解放します。「別のスレッドがオブジェクトの通知()メソッドまたはのnotifyAll()メソッドを呼び出すまで」、現在のスレッドが(「READY状態」に)目覚め

役割)(通知)とのnotifyAll(それが現在の主題にスレッドを待機アップウェイクである通知()は、単一のスレッドを目覚めさせることである、のnotifyAll()は、ウェイクアップ、すべてのスレッドであります

待ち時間(長いタイムアウト)「は、別のスレッドがオブジェクトの通知()メソッドまたはのnotifyAll()メソッド、または指定された時間を呼び出すまで」と、現在のスレッドは、「入力する(ウェイクアップので、「待機(遮断)状態」で現在のスレッドこと準備状態「)

Thread.yield Javaスレッド()メソッド、翻訳されたスレッドの譲歩。名前が示唆した後、スレッドは、このメソッドを使用するとき、それはアウトできるようにCPUの実行時間を所有することを、自分自身や他のスレッドが実行してみましょう、自分自身に注意を払うにあるか、他のスレッドではない、単に他のスレッドを与えるために、実行しています。

歩留まりの役割は、()譲歩です。後で、しかし、現在のスレッドは利回り()、同じ優先度を持つ他のを呼び出すことを保証するものではありませんが、それはとても執行力に同一の優先アクセス権を持つ他の待機スレッドがあること、現在のスレッド「準備状態」に「実行状態」を可能にスレッドは、右の実装を取得することができます。また、可能、現在のスレッドが「動作状態」に入ったことを実行し続けます

歩留まりの役割は、()CPUは、ロックをしないだけ出すれます

シリアルパラレル変更からスレッドを順次実行することができるように()メソッドは、権利取得の実行を、参加

setPriorityを()メソッドは、設定された優先順位は、Javaの優先レベルを1~10に分割され、デフォルト値は5であるが、優先度のスレッドの実行順序を保証することができない、順序が実際のCPUによって決定されます  

デーモンスレッドは、メインスレッド滅びるのスレッド、例えばGCスレッドとしてメインスレッドを、サービング、新しいスレッドがユーザスレッド(非デーモンスレッド)であります

setdaemon(ブールの)デーモンスレッドを設定し、デフォルトはfalseで、真のデーモンスレッド

*注:UPUのタイムスライスを実装するために割り当てられたガーディアンのスレッドが最終的に必ずしも役割を果たしていない、それは完全にオペレーティングシステムスケジューラによって決定され実行されないでしょう

第四に、スレッド間で共有

1.synchronizedキーワード(ビルトインロック)

実行中のスレッド終了されるまでのステップが確立コードのステップに従って実行されるように、それはスクリプトのように、独自のスタックスペースがあります。しかし、各実行中のスレッド、それは非常に少ない、複数のスレッドが物事との共同契約の間でデータの共有など、作業を完了するために相互に協力することができた場合、単独でのみ、そしてなしほとんど価値、あるいは価値を実行している場合。これは非常に大きな価値をもたらすでしょう。Javaサポート複数のスレッドがオブジェクトまたはオブジェクトのメンバ変数にアクセスし、キーワードを使用する方法、またはシンクブロックの形で同期変更することができ、それは同時に、複数のスレッドを確実にするために主に、この方法で唯一のスレッドまたはシンクブロックは、それが可視とも内蔵ロック機構として知られている変数へのアクセスの排他的なスレッドを、確実にします。

オブジェクトとクラスは、ロックをロック:オブジェクトインスタンスのオブジェクトをロックする、またはオブジェクトのインスタンスは、オブジェクト・クラスロックは、クラスに静的メソッドまたはクラスのクラスです。私たちは、オブジェクトインスタンスのクラスは、多くのことができることを知っているが、各クラスが一つだけクラスオブジェクト、異なるオブジェクトのインスタンスが互いに干渉オブジェクトのロックを持っていますが、各クラスは1つのクラスのロックを持っています。しかし、一つのことは、ロックロックは、各クラスのオブジェクトの対応するクラスであるように、実際には、真実ではない概念上のロックのようなだけで何かが、実際には、そこにあることに留意しなければなりません。ロックとオブジェクト間のロックが非干渉されています

有用性と使用

(1)方法ロック(同期方法)、シンクブロック

公共同期無効incCount2(){数++;}

ます。public void incCount3(){ 

 同期(本){ 

 ++数えます。 

 }

}

(2)オブジェクトのロック

プライベートObjectobjは、新しいオブジェクトを()=; //ロックなど

ます。public void incCount(){ 

 同期(OBJ){ 

 ++数えます。 

 }

}

ロック(3)

パブリック同期静的ボイドincCount4(){カウント++;}

*注:同期ロックオブジェクトは、オブジェクトのロックを変更することができないことを確認する必要があります

最軽量2.volatile同期メカニズム

揮発性変数のスレッド修正値であり、この変数の操作、異なるスレッドが、他のスレッドにこの新しい値が直ちに表示されているときに視認性を確保

揮発性のスレッドが同時に複数のスレッドに書き込まれたデータの安全性を保証することはできません

最も揮発性の適用シナリオ:スレッドの書き込みには、複数のスレッドを読んで

3.ThreadLocal分析

Synchonizedと比較して(1)

ThreadLocalのとSynchonizedは、マルチスレッドの同時アクセスを解決するために使用されています。しかし、ThreadLocalのとは違いの本質を同期。ロック機構、時可変コードブロックを使用して同期、またはその唯一のスレッドがアクセスすることができます。訪問までの時間で各スレッドが同じオブジェクトでないように、各スレッドのThreadLocalのは、このようにデータの複数のスレッドで共有されるデータを分離、変数のコピーを提供します

SpringのトランザクションはThreadLocalのクラスに役立ちます。春は、データベース接続プールから接続を取得し、その後、ThreadLocalの接続に入れ、およびスレッド結合があります

限り接続としてのThreadLocalから操作ます。なぜ春のトランザクションはThreadLocalのクラスに依存しなければなりませんか?JDBCには、例えば、通常のトランザクションコードは次のようになります。

 DBC = newDataBaseConnection(); // 1行目 

Connectioncon = dbc.getConnection(); //ライン2

 con.setAutoCommit(偽); //// 3行目 

con.executeUpdate(...); //ライン4 

con.executeUpdate(...); //ライン5 

con.executeUpdate(...); //ライン6 

con.commit(); ////行7 

3つのビジネス処理ステージに行1:トランザクション準備フェーズ:コードは、3つの部分に分けることができる第4-6行トランザクションが段階コミット:ライン7がはっきり見ることができる、我々は、トランザクションまたは特定のSQLの実装を開くかどうかを私たちは、特定のデータベース接続が必要です。今、私たちは、私たちはDAO(DataAccessObject)オブジェクトの下のコードの業務をコントロールしている場合、それらを開くためにあらゆる方法でのDAOオブジェクトで、トランザクションを終了し、通話時のDAOでのサービスオブジェクト開発したアプリケーションは、通常、3層構造を使用してい唯一の場合はDAOコールので、我々は良い結果を達成していることが、することはしばしば私たちのサービスは、データベース上で複数の一連の操作DAOを呼び出します、そして今回は、実際のアプリケーションので、ボーダーの業務を制御することはできませんDAOの数は、私たちのサービスが不確かである呼び出し、需要に応じて異なりますが、また状況がサービスコールのサービスを生じる可能性があります

の使用(2)のThreadLocal

ThreadLocalのクラスインターフェイスは非常にシンプルですが、唯一の4つの方法は、のは、見てみましょう: 

•voidset(Objectvalue)は、現在のスレッドのスレッドローカル変数の値を設定します。

 •publicObjectget()メソッドは、現在のスレッドに対応するスレッドローカル変数を返します。

 •publicvoidremove()が削除され、現在のスレッドのローカル変数の値は、目的は、JDK 5.0の新しい方法であるメモリ使用量を低減することです。とても明示的にローカル変数が動作するために必要とされていないが、それはメモリ速度の回復をスピードアップすることができますスレッドをクリアするには、このメソッドを呼び出して、スレッドの終了、スレッドローカル変数は自動的にゴミであるべきとき、ことに留意すべきです。

 •protectedObjectinitialValue()は明らかにサブクラスがデザインをカバーできるようにするために、保護された方法であり、このスレッドローカル変数の初期値を返します。この方法では、遅延呼び出しに、コールget()メソッドであるかのセット(オブジェクト)とき実行スレッドは初めて、と一度だけ実行します。直接リターンのデフォルトのThreadLocalはnull。

publicfinalstaticThreadLocalの<string> RESOURCE =新規のThreadLocal <ストリング>(); RESOURCEは、String型のオブジェクトを格納ThreadLocalの可能を表します。このとき、一つのスレッドが変数にアクセスすることができ、同時に何に関係なく、それが書かれている、読んでの操作はスレッドセーフです。

 

上記はあくまで個々の学習の見解を表している、我々は学習基準を提供したいと考えています

 

公開された18元の記事 ウォンの賞賛4 ビュー140

おすすめ

転載: blog.csdn.net/weixin_42081445/article/details/104828948