一般的な面接の質問の要約をマルチスレッド

1.スレッドとプロセス

スレッド 
 ここでは、スレッドはプログラム実行中のスレッド実体を指します。JVMは、同時にスレッドを実行するアプリケーションを可能にします。JavaスレッドでのホットスポットJVMとネイティブオペレーティングシステムのスレッドが直接マッピングされています。場合は、スレッドローカルストレージ、割り当てをバッファリングし、同期オブジェクト、スタック、プログラムカウンタ、準備ができて、それはオペレーティングシステムのネイティブスレッドを作成します。Javaスレッド終了、ネイティブスレッドがリサイクルされます。オペレーティングシステムは、すべてのスレッドをスケジュールする責任があり、使用可能な任意のCPUに割り当てます。元のスレッドの初期化が完了すると、それは()メソッドを実行するJavaスレッドを呼び出します。スレッドの終了時に、それはすべてのリソースのネイティブJavaスレッドとスレッドを解放します。
プロセス
  プロセスは、データのセットだけでなく、オペレーティングシステムリソースの割り当てとスケジューリングの基本単位で活動を計算する上で同時に実行することができるプログラムです。

プロセスと手続きの関係との違い

①プログラムは、命令の順序集合である、それはすべての操作の意味を持っていない、それは静的な概念です。プロセスは、動的な概念であり、プロセッサ上でプログラムを実行する処理です。

②ソフトウェア・プログラムは、長期的なデータが存在として使用することができますが、特定のプロセスのライフサイクルがあります。プログラムでは、プロセスが一時的なものであり、永久的です。

注:このプログラムは、レシピとして見ることができるが、プロセスは調理用レシピに従った処理です。

③プロセスと異なるの手順:プログラム、データ、及びプロセス制御ブロックによる処理は、3つの部分から構成されています。

④プロセスおよび手順の間の対応は:繰り返すことにより、プログラムが複数のプロセスを持つことができ、呼び出し関係により、複数のプログラムを含むことができるプロセス。

2.平行と同時の差

  • 1つの説明は、2つの以上の並列イベントに同時に発生いうと同じ時間間隔で発生する二つ以上の同時イベントを指します。
  • 異なるエンティティ上での並列複数のイベント、同じエンティティの同時複数のイベント:2を説明します。
  • 3つの説明:並列プロセッサ上で、複数のタスクを処理するために「同時」であり、同時に複数のプロセッサ上で同時に複数のタスクを処理しています。Hadoopの分散クラスタとして。

スレッドへの道を作成します3。

Threadクラスの継承
  本質的にThreadクラスは、スレッドのインスタンスを表す、Runnableインタフェースのインスタンスを達成することです。スレッドを開始する唯一の方法は、開始スレッドクラスによって()インスタンスメソッドです。スタートは()メソッドがネイティブメソッドである、それは新しいスレッドを開始し、実行は、()メソッドを実行します。
Runnableを実装します。
  あなたのクラスがすでに別のクラスを拡張する場合は、あなたが直接スレッドを拡張することができない、この時間、あなたは、Runnableインタフェースを実現することができます
ExecutorServiceの、呼び出し可能<クラス>、将来スレッドの戻り値
  これは、値のタスクは何の戻り値は、Runnableインタフェースである必要があります呼び出し可能インターフェースと同様のタスクを実装する必要があります返します。呼び出し可能なタスクを実行した後、あなたが未来のオブジェクトを取得することができ、マルチスレッドの結果を返した伝説を達成することができ、スレッドプールのExecutorServiceのインターフェイスと組み合わせるあなたがオブジェクト呼び出し可能なタスクのリターンを得ることができるオブジェクト上で取得し、呼び出します。 
途中に基づいて、スレッドプール
  スレッドとデータベース接続は、これらのリソースは、貴重な資源です。あなたは、作成不要な時を破壊する必要があるたびので、リソースの非常に無駄にすることができます。その後、我々は、キャッシング戦略は、スレッドプールを使用することで使用することができます。

スレッドプールを作成する4.方法

newCachedThreadPool
  あなたは、新しいスレッドを作成するスレッドプールを作成する必要があるかもしれませんが、利用可能な場合、彼らは以前に構築のスレッドを再利用します。短期プログラムの多くは、非同期タスクを実行するためには、これらのプールは、典型的には、プログラムのパフォーマンスが向上します。(スレッドが利用可能な場合)を実行するための呼び出しは、以前に構築のスレッドを再利用します。既存のスレッドが使用できない場合は、新しいスレッドが作成され、プールに追加されます。キャッシュから60秒間使用されていないこれらのスレッドを終了し、削除します。そのため、長い間アイドル状態のスレッドプールはすべてのリソースを使用していないまま。
newFixedThreadPool
  これらのスレッドを実行するために、共有アンバウンド形式のキューにスレッドの固定数を再利用するスレッドプールを作成します。任意の時点で、ほとんどのnthreadsの値にスレッドがアクティブな処理タスクです。あなたが利用可能なスレッドを持って前に、すべてのスレッドが、アクティブになっているときに、追加のタスクを送信した場合、追加のタスクがキュー内で待機します。何らかのスレッドが終了するの故障に閉鎖する前に、実行中の場合は、(必要な場合)、後続のタスクを実行するために新しいスレッドと交換してください。スレッドが明示的に閉じられる前に、スレッドプールは常に存在します。
newScheduledThreadPool
  指定された遅延時間後に実行するコマンドをスケジュールすることができ、または定期的に実行するスレッドプールを作成します。 
ScheduledThreadPool = Executors.newScheduledThreadPool ScheduledExecutorService(3。); 
 scheduledThreadPool.schedule(newRunnable(){ 
 @Override 
 公共 ボイドRUNを(){ 
 のSystem.out.printlnは( "3秒遅延" ); 
 } 
 }、 3。、TimeUnit.SECONDS); 
scheduledThreadPool .scheduleAtFixedRate(newRunnable(){ 
 @Override 
 公共 ボイドRUN(){ 
 System.out.printlnは( "実行する遅延一秒毎に3秒" ); 
 } 
 }、 1,3、TimeUnit.SECONDS)。
newSingleThreadExecutor
  (または例外が発生する)Executors.newSingleThreadExecutor()(これが唯一のスレッドプールのスレッドである)スレッドプールを返し、このスレッドプールのスレッドが実行を継続するために元のスレッドを置き換えるために、スレッドの死の後に再起動することができます! 

5.スレッドのライフサイクル(状態) 

  スレッドが作成され、開始された場合、実行状態に入るためのスタートでもない、またそれは、状態の実行中になっています。ライフサイクルのスレッドでは、それが(実行)を実行し、新(新)、レディ(Runnableを)を通過しなければならない5つの状態を、(ブロック)ブロックされ、死亡(死者)。スレッドの状態がブロック間のスイッチに複数回実行されますので、スレッドが開始した後、それは一人で実行するためのCPUを「占有」されていないので、複数のCPUスレッド間で切り替える必要があります場合は特に

新しい状態(NEW)
  プログラムは、新しいキーワードを使用してスレッドを作成すると、スレッドが新しい状態にあり、この時間は、JVMメモリに割り当てられた値、及び、そのメンバ変数を初期化します
レディ状態(RUNNABLE)
  スレッドオブジェクトは、start()メソッドをコールするときに、スレッドが準備完了状態にあります。メソッドを作成するには、Java仮想マシン呼び出しスタックとプログラムカウンタ、実行するようにスケジュールされるのを待っています
ファイル名を指定して実行状態(RUNNING):
  実行のスレッドスレッドはCPU、開始run()メソッドを得ることがレディ状態にある場合、スレッドが実行されています
ブロックされた(ブロック):
  状態手段を遮断すること、一時的に実行を停止し、CPUのタイムスライスの外に出しているCPUを使用する権利を放棄するためにいくつかの理由のためのスレッド。スレッドが実行可能(実行可能)状態になるまで、実行するためにCPUのタイムスライスを取得する機会を持って再び状態(ランニング)
状態。三つのカテゴリーの閉塞の場合:
  待機閉塞(o.wait->待機列):
    実行ラン(ランニング)()メソッドのO.waitスレッド、JVMは中(キューをwaitting)待ちキューにスレッドします。
  同期ブロック(ロックイン>ロックプール)
    同期ロックオブジェクトを取得する際、同期ロックが別のスレッドによって占有されている場合、JVMは、スレッド・プール(ロック・プール)にロックされます(実行中)実行中のスレッド。
  他のブロッキング(スリープ/参加)
    実行中のスレッド(実行する)のThread.sleep(ロングMS)又はt.join()メソッドを実行し、またはI / O要求を発行され、JVMは、スレッドがブロックされて設定されます。睡眠()タイムアウト、参加()または終了するスレッドのタイムアウト待ち、またはI / O
    処理されたときに、スレッドが(実行可能)状態に再実行することができます。 
スレッドの死(DEAD)
スレッドは、次の3つの方法で、最後は死の状態で終了します。
正常終了
1.ラン()又は()メソッドの呼び出しの実行は、スレッドの正常終了を完了する。
異常終了
2.スロー例外エラーやキャッチされないスレッド。
停止呼び出し
3.スレッド終了するスレッドのstop()メソッドを呼び出すダイレクト - 通常簡単にデッドロックにつながるある、お勧めできません。
 

 

 6.sleepウェイト差

睡眠()メソッド1.は、我々は最初のThreadクラスを属するかを知る必要があります。そして、待機()メソッドは、オブジェクトクラスに属します。
2.スリープ()メソッドは、指定した時間を停止するプログラムでの結果なので、他のスレッドのCPUということはなく、指定した時間がアップしているとき、彼の遺骨は、状態を監視して、自動的に運転を再開します。
睡眠()メソッドを呼び出す処理3.、スレッドは、オブジェクトのロックを解除しません。
4.そして時にコール待ち()メソッド、スレッドがこのオブジェクトのロックのプール待ちに入るのを待って、オブジェクトのロックを放棄し、このオブジェクトだけ呼び出しの操作にオブジェクトのロックを取得する準備ができてプールに入る前に、オブジェクトのロック後のスレッドの()メソッドを通知します状態

7.startと実行の違い

1.()メソッドは、スレッド、真のマルチスレッド動作を開始します。完成されたメソッド本体のコードを待たずに時間を実行するには、次のコードに直接進むこともできます。
2. Threadクラスのstart()メソッドを呼び出すことにより、スレッドを起動し、その後、このスレッドは準備完了状態にあり、実行されていません。
前記方法の実行は()このスレッドは、実行機能コードを実行する実行状態にスレッドを実行するコンテンツを含む、スレッドの本体と呼ばれています。仕上げにメソッドを実行し、このスレッドを終了します。その後、CPUは他のスレッドを再スケジュール。

8.volatileキーワードの役割(変数の可視性、順序変更禁止)

  Java言語、すなわち揮発性の変数が他のスレッドに更新通知変数ことを確実にするために使用される、より弱い同期機構を提供します。揮発性変数は二つの特徴を持って、揮発性の変数がvolatile変数を読み込む際に常に最も最近書かれた値を返すので、レジスタや目に見えない他の場所にキャッシュされません。
可視性変数
  一方、変数は、スレッド変数の値を変更したときに視認手段は、その後、他のスレッドのための新しい値を直ちに得ることができるすべてのスレッドに可視であることを保証することです。
並べ替え禁止
  揮発性の禁止命令再配置。揮発性の変数にアクセスするとき以上のロック操作を行うと、そのため、行わない実行スレッドがブロックされているので、揮発性変数はsychronizedキーワードよりも軽量な同期メカニズムである。しない軽量な同期ロックをsychronized このシナリオの揮発性:変数は、スレッドは、変数割当に直接、複数のスレッドで共有されています。 
  場合は、不揮発性の読み取りと書き込み変数、変数の各スレッドのメモリコピーは、CPUのキャッシュを開始します。コンピュータに複数のCPUを有する場合、各スレッドは、各スレッドがで異なるCPUcacheにコピーすることができることを意味し、異なるCPUで処理することができます。変数の宣言は、JVMは、各読み取り変数がメモリから読み出されていること、CPUは、この手順を省略キャッシュ確保し、揮発性です。
該当シーン
  本質的に、私は++、読み取り、書き込み2回の操作であるため、揮発性変数/ライト動作の単一の読み取りは、このような長い、ダブル変数として原子性を保証することができますが、アトミックI ++この操作を保証するものではないことに留意すべきです。同期いくつかのシナリオで置き換えてもよいです。ただし、揮発性の缶が完全に同期位置を交換しないで、とだけいくつかの特別なシナリオでは、揮発性適用するためです。一般的には、以下の条件では、安全な同時実行スレッド環境を確保するために満たす必要があります。
(1)変数への書き込みアクセス(例えばIなど++)現在の値に依存しない、または単純な変数の割り当て(booleanflag =真)。
(2)変数は相互に依存しない異なる揮発性変数との間の他の変数、すなわち、不変には含まれません。状態は、プログラム内の他のコンテンツを真に独立している場合にのみ、揮発使用します。

9.最初の発生原理

1、プログラムシーケンスルール。事前にスレッドEDITORIALコードブックではバックで発生しました。むしろ、それはいくつかの分岐構造なぜならプログラム順序の制御フローによれば、あるべきです。

2、揮発性変数ルール。揮発性変数に、彼は最初の読み込み操作で発生した書き込みます。

図3は、スレッドがルールを起動します。このスレッド内のすべての動きをスレッドオブジェクト()メソッドが最初に出現し始めます。

4、スレッドは、ルールを終了します。すべての操作は控えスレッドの終了のこのスレッドの検出で発生しています。

5、ブレークルールを通します。割り込みスレッドコード割り込みイベントを検出した最初の発生()メソッドに割り込みスレッドに呼び出します。

図6に示すように、オブジェクトの終了ルール。オブジェクトが完了する(ラインコンストラクタの端部)を初期化する最初の発生の発行finilize()メソッドを開始します。

7、推移。Bの最初の発生、B Cは、C Aが最初に発生し、その後、最初の発生します

図8に示すように、ルールをロックチューブ。最初のロック解除操作後のロック動作とロックの顔が発生します。

プロセスやスレッド間10メソッド呼び出し

11.java共通ロック

12.synchronized原則基本的な実装

何13.synchronizedとReentrantLockの差はありますか?

  • 同期競争は常にロックを待っていることでしょう。ReentrantLockのロックとゲットする結果を取得しようとすることができます
  • ロックを取得同期タイムアウトを設定することができない。ReentrantLockのロックを取得するためのタイムアウトを設定することができ
  • 同期公平性がロックを達成することはできません。ロックに入るために待つことであるReentrantLockの出会いフェアロック、
  • そして、制御待つ(ロックオブジェクト待機結合ウェークアップ同期)及び(通知)のnotifyAll();ウェイクアップのawaitを結合条件(ReentrantLockのため及び制御待ち)と信号()、signalAll()メソッド
  • 同期JVMレベルが達成される。ReentrantLockのJDKを達成するためにコード・レベルであります
  • 放出をReentrantLockのを自動的にロックを解除しない、それが最終的に必要である{}ブロック示すロックまたは異常のコードの同期ブロックを実行し、自動的にロックを解除

14.ReentrantReadWriteLock読み書きロックは、詳細な

実装15.BlockingQueueブロッキングキュー

 

おすすめ

転載: www.cnblogs.com/yjc1605961523/p/12594379.html