1.概念の定義
1.1 CPUとは何ですか?
(1)それは、VLSIであるコンピューティング・コアと制御コアコンピュータであり、中央プロセッサをCentralProgressingUnit。
(2)CPUは、演算ユニット、キャッシュメモリ、バスを含みます。
(3)コンピュータ命令データの解釈、およびコンピュータソフトウェアの処理に主に機能しています。それは、お使いのコンピュータ上で最も重要な役割を果たしている様々なアプリケーションのためのシステム制御センター、統一された調整および制御を構成しています。
1.2プロセスとは何ですか?
プロセスは、データセットの活動を実行する独立したアプリケーションの機能です。処理システムは、リソースの割り当てとスケジューリングの別個のユニットです。
シンプルで、ちょうど私の日常生活のように、コンピュータのアプリで開きます(例:QQの音楽、テンセントビデオ、など)。私は、これはプロセスであり、タスクマネージャのQQの音楽プログラムが実行中であり見ることができます。我々はテンセントのビデオを開くと、ときは、プロセス(テンセントビデオ)のよりとなります。
1.3スレッドとは何ですか?
スレッドは、プロセスが属し、エンティティプロセスであるCPUスケジューリングとディスパッチの基本単位です。プロセスへのリソースのリソース割り当て、すべてのスレッドがプロセスを共有します
私たちはQQの音楽を開くと、音楽プレーヤーをクリックして、私たちはまず、プロセスは、再生を実行するためのスレッドを作成し、その後、あなたは音楽を鳴らす聞くことができます。この時点で、私たちは、音楽XXXの検索を検索パネルを開きます。そして、終わらなかった音楽をスレッドが、別のスレッドによって検索操作を実行します。(多くの関係の一つ)
1.4関係のマルチスレッドとCPU?
シングルコアCPUは、単位時間当たりに、一つだけのスレッドがタスクを実行します。すなわちAとB二つのスレッドは、実行がBで実行するために、Aまでホールドオフになるときに実行されます
マルチコアCPUは、単位時間当たりに、複数のスレッドがタスクを実行することができます。2コアCPUは、実行核2CPUに実行するコア糸、およびスレッドBを1CPU真の並列実行を可能にするであろう。
1.5同時性とは何ですか?パラレルとは何ですか?
パラレル:同時に処理ロジックに対して行わCPUインスタンスまたは複数のマシンの複数が同時に真です。
同時実行:CUPのスケジューリングアルゴリズムにより、ユーザーは運用レベルながら、実際には、本当にCPUから、実行するために同じ時間を見てすることができます。同時は、多くの場合、公共のリソースを必要とし、公共資源の調整が困難なプロセスとスレッドの同時実行です。
私はシングルコアCPUのコンピュータだった場合、私はQQの音楽アプリを開き、音楽の曲を演奏します。それと同時に、私はリーグを開いて、ゲームを開始する準備ができています。その後、彼らの両方のプロセスが、だけで、単位時間タスクごとに1つのスレッドを実行することができます。ユニオン、QQの音楽は再生を停止しません時に英雄を再生するために。CPUのスケジューリングアルゴリズムは、(もちろん、人間の反応時間よりもはるかに高速です)伝説のリーグとQQの音楽トグルの実行中に、使用され、その後、私たちは音楽を再生し、同時にゲームをプレイする必要があります実行の錯覚です。
それはマルチコアCPUの場合、CPUコアは、QQの音楽、英雄ユニオンエグゼクティブを実行することができます。
1.6クアッドコア8スレッドとは何ですか?
それはCPUをご紹介しますと、コンピュータを購入する場合、このような基準値です。最終的にはそれは少し知恵が意味するのですか?
上述した、CPUは、時間の単位ごとに1つのスレッドを実行することができます。あなたは、時間の単位で作業したい場合は2つのエンティティのCPUユニットがない限り、複数のスレッドが、不可能です。マルチコア技術は、単一のパッケージ内に置か同じ複数のCPUである(または直接2つのCPUチップを作る)、およびインテル®HTテクノロジーは、たった2つのスレッドにCPUのシミュレーションを行い、CPU内に必要なリソースをコピーしています;それは、物理的なデュアルコア、デュアルスレッドの動作をシミュレートするために2つのスレッドを動作するソリッドコア、単位時間内に二つの論理スレッド、プロセスです。
だから、4と8つのスレッドクアッドコアCPUに代わって、CPUごとに8つのスレッドは、2つの代表論理スレッドを持っています。単位時間あたり8つのスレッドまで作業を実行します。
2.マルチスレッドのライフサイクル
:スレッドは5つの状態が含ま
1.新(新):この状態のスレッドオブジェクトが作成され、それは意志だけで簡単に。この時点では、システムリソースを割り当てられている必要があります。また、初期化が行われます。たとえば、スレッドのスレッド=新しいスレッド() 。
図2は、レディ(Runnableを)は:と呼ばれる"実行状態"。スレッドオブジェクトを作成した後、スレッドを開始するように、他のスレッドは、オブジェクトのstart()メソッドを呼び出します。例えば、thread.start()。いつでも即応の状態をスレッドはCPUスケジューリングによって実行することができます。
3、実行します(実行中):CPUのスレッドが実行するための許可を得ることができます。注意:動作状態への準備状態からわずかスレッドを。
4は、ブロックされた(ブロック):スレッドがCPUを使用する権利を放棄するためにいくつかの理由でブロックされて一時的に実行を停止します。レディ状態にスレッド、ランニング行く機会まで。:障害物の場合は3種類に分け
呼び出し元のスレッドで()メソッド待ち、そのジョブの完了を待つスレッド:(1)を待ってブロックされました。
(2)同期ブロック:同期スレッド同期ロックの障害(ロックが別のスレッドによって占有されているので)を取得し、それは同期ブロッキング状態になります。
(3)その他のブロックされた:スリープ(呼び出し元のスレッド)によって、またはブロックされた状態にI / O要求、スレッドを発行します。ときにスリープ()タイムアウト、ジョイン()が終了するスレッドまたはタイムアウトを待ちます。またはI / O処理が完了すると、再びレディ状態にスレッド。
5.死(死):スレッドの実行が終わったり、異常終了するrun()メソッド、ライフサイクルの糸端です。
3.マルチスレッドを作成します。
モード: パッケージcom.my.thread; / ** スレッドを作成する*継承スレッド * @著者:onereader * @日:2018年9月5日 * / パブリック クラス MyThreadDemo1は延びスレッド{ 公共 静的 ボイド{メイン(文字列[]引数)を MyThreadDemo1さt1 = 新しいMyThreadDemo1()。 t1.start(); System.out.println( "メインスレッド" ); } @オーバーライド 公共 ボイドラン(){ System.out.println(「スレッド作成スレッドを達成するための継承の使用」)。 } } 第二の方法: パッケージcom.my.thread。 / ** *作成するには、Runnableインタフェースを実装 * @著者:onereader * @日:2018年9月5日 * / パブリック クラス MyThreadDemo2が実装Runnableを{ 公共 静的 ボイドメイン(文字列[]引数)を{ MyThreadDemo2さt2 = 新しいMyThreadDemo2()。 スレッドt = 新しいスレッド(T2)。 t.start(); System.out.println( "主线程" ); 以下のために(int型、iは100 <; i = 1からiが++ ){ System.out.println( "メインスレッド出力:" + I)。 } } @オーバーライド 公共 ボイドラン(){ System.out.println( "実行可能スレッド作成インターフェース" ) のために(INT I = 1; I <100; I ++は){ System.out.println( "出力スレッドMyThreadDemo2:" + I)。 } } } 三つの方法: パッケージcom.my.thread。 輸入java.util.concurrent.Callable。 輸入java.util.concurrent.FutureTask。 / ** スレッドを作成するには、*内部クラス * @著者:onereader * @日:2018年9月5日 * / パブリック クラスMyThreadDemo3 { 静的 クラス ThreadDemoが実装呼び出し可能<文字列> { @オーバーライド パブリック文字列コール(){ System.out.println( "こんにちはスレッド" ); リターン「呼び出し可能戻り値」。 } } パブリック 静的 ボイドメイン(文字列[]引数){ ThreadDemo threadDemo = 新しいThreadDemo(); FutureTask <文字列> futureTask = 新しい FutureTask <文字列> (threadDemo)。 スレッドスレッド = 新しいスレッド(futureTask)。 thread.start(); してみてください{ System.out.println(futureTask.get())。 } キャッチ(例外e){ e.printStackTrace(); } } }
以上只是个简单的总结,后续会更精彩的哟!