インタビューの要約のJavaのマルチスレッドと並行処理の基礎

Javaのマルチスレッドのインタビューの質問

1.プロセスとスレッドの違いは何ですか?

プロセスは、プログラムまたはアプリケーションとして見ることができる、独立した(自己完結型)動作環境です。スレッドは、プロセスで行われる作業です。Javaランタイム環境は、1つのプロセスが異なるクラスやプログラムが含まれています。スレッドは軽量プロセスと呼ばれることができます。スレッドが作成するより少ないリソースを必要とし、プロセスに常駐し、処理は、リソースを共有することができます。

2.マルチスレッドプログラミングの利点は何ですか?

マルチスレッドプログラムでは、複数のスレッドの同時実行がプログラムの効率を向上させることにある、CPUがアイドル状態のリソースを入力するスレッドを待つ必要はありません。ヒープメモリ(ヒープメモリ)共有複数のスレッドは、そう複数のプロセスを作成するよりも優れたいくつかのタスクを実行するために複数のスレッドを作成します。サーブレットとCGIがマルチスレッドのサポートをサポートしていないので、例えば、CGIよりも優れサーブレット。

3、ユーザスレッドとスレッドガードの違いは何ですか?

私たちは、Javaプログラム内のスレッドを作成する場合は、ユーザー・スレッドと呼ばれています。スレッドは、バックグラウンドでデーモンで、JVMのスレッドの終了を防ぐことはできません。実行中のユーザスレッドが存在しない場合には、JVMは、プログラムを閉じて終了し。子スレッドのスレッドの作成の保護者は、まだデーモンスレッドです。

4.どのようにスレッドを作成するのですか?

2番目は、直接後継Threadクラスである1は、Runnableインタフェースを実現することであり、それはThreadオブジェクトを作成し、スレッドのコンストラクタに渡さ:スレッドを作成するには、2つの一般的な方法があります。

5.ライフサイクルの異なるスレッドは何ですか?

私たちは、Javaプログラムで新しいスレッドを作成すると、そのステータスは新しいです。我々は、スレッドのstart()メソッドを呼び出すと、ステータスはRunnableをに変更されます。スレッドスケジューラは、スレッドプール内のCPU時間のRunnableスレッドを割り当て、それらの状態の実行中に変更します。

図6は、直接実行Threadクラス()メソッドも呼び出すことができますか?

もちろん、あなたがすることができますが、我々はスレッドのrun()メソッドを呼び出した場合、その動作は新しいスレッドで私たちのコードを実行するためには、あなたがThread.start()メソッドを使用する必要があり、通常の方法と同じになります。

7、どのようにいくつかの時間のために実行中のスレッドのポーズを作るには?

私たちはいくつかの時間のために一時停止するThreadクラスのスリープ()メソッドのスレッドを使用することができます。これは、スレッドの終了をしないことに注意してください、一度冬眠から目覚めたスレッドは、スレッドの状態は、Runnableをに変更され、スレッドのスケジューリングによると、それが実装されます。

8.スレッドの優先度のご理解とは何ですか?

各スレッドは、実行時に優先順位、一般に、高い優先順位のスレッドを持つ優先度を有するが、これは、スレッドスケジューリングの実装に依存し、この実装は(OSに依存する)に依存するオペレーティングシステムです。私たちは、スレッドの優先順位を定義することができますが、これは、優先度の高いスレッドが優先順位の低いスレッドの前に実行されます保証するものではありません。スレッドの優先順位は、1が最低の優先順位であり、10が最優先である(1-10)からint型の変数です。

9.スレッドスケジューラ(スレッドスケジューラ)とタイムスライス(タイムスライス)とは何ですか?

スレッドスケジューラは、CPU時間のRunnableをスレッド割り当ての状態に責任があるオペレーティングシステムのサービスです。我々はスレッドを作成し、それを起動したら、それはスレッドスケジューラの実装の実装に依存します。

使用可能なスレッドのRunnableに割り当てられた利用可能なCPU時間である処理時間スライスを指します。優先順位のスレッドまたは上の待つスレッドできるCPU時間を割り当てます。アプリケーションは、それがより良い選択(つまり、アプリケーションがスレッドの優先順位に依存せてはいけないと言うことです)で制御するので、スレッドのスケジューリングは、Java仮想マシンによって制御されていません。

10、マルチスレッドでは、コンテキストスイッチ(コンテキストスイッチ)は何ですか?

コンテキストスイッチは、それが実行のスレッドが中断時点から再開することができるように、格納及びCPU状態復元処理をすることです。コンテキストの切り替えは、マルチタスク・オペレーティング・システムとマルチスレッド環境の本質的な特徴です。

11.どのようにスレッドがJavaプログラムでmain()メソッドは、最後のスレッドを終了していることを確認していますか?

我々は、すべてのプログラムがmain()メソッドが終了の終了前にスレッドによって作成されたことを確認するために、Threadクラスのjoin()メソッドを使用することができます。

12、どのようにスレッド間で通信するには?

スレッドがリソースを共有することができた場合、スレッド間通信は、その手段を調整することが重要です。スレッドがリソースの状態にロックとの間にオブジェクト・クラス待ち()\通知()\のnotifyAll()メソッドは、通信のために使用することができます。

13.なぜ待ちのスレッド通信方式()、通知()とのnotifyAll()オブジェクトクラスで定義されていますか?

各オブジェクトは、他のスレッドが利用可能なオブジェクトをオブジェクトロックまたは通知モニタを待っようなJavaでロック(モニタ、モニタがあってもよい)および(待機)、通知()メソッドと有しています。Javaスレッドで使用されるすべてのロックと同期オブジェクトでは使用できません。これらの方法は、オブジェクトクラスの一部である理由である、各クラスは、スレッド間の通信のためのJavaの基本的な方法を有します

14は、その理由(通知)(待つ)とのnotifyAll()同期メソッドや同期ブロックと呼ばれなければなりませんか?

スレッドがオブジェクトの待機()メソッドを呼び出す必要がある場合、スレッドは、それがオブジェクトのロックを解除し、別のスレッドの呼び出し)が(このテーマに関する方法を通知するまで待機状態に入るだろう、オブジェクトのロックを持っている必要があります。同様に、スレッドは他のスレッドがオブジェクトのロックを取得することができます待っているように、オブジェクトのロックを解除するオブジェクトの通知()メソッドを呼び出す必要があります。これらの方法のすべてのスレッドを必要とするので、オブジェクトのロックを保持しているので、唯一の同期を介して達成することができ、それらは唯一の同期方式または同期ブロックと呼ぶことができます。

15、なぜThreadクラスの睡眠()および収率()メソッドは静的ですか?

スリープ(Threadクラス)と収率()メソッドは、現在実行されているスレッドで実行されます。だから、待機状態で他のスレッド上でこれらのメソッドを呼び出すことは無意味です。これらのメソッドは静的であり、このためです。彼らは、現在実行中のスレッドで作業することができ、およびプログラマが他の非実行中のスレッドでこれらのメソッドを呼び出すことができると信じて誤って避けること。

16、どのようにスレッドセーフを保証するには?

原子クラス(原子並行クラス)と同期して、ロック並列同じクラスとスレッドセーフなクラスを使用し、揮発性のキーワードを使用し、 - スレッドの安全性を確保するためのJavaには多くの方法があります。スレッドの安全性のチュートリアルでは、より多くを学ぶことができます。

どのような役割で、Javaの17、volatileキーワード?

私たちは、変数を変更するために揮発性のキーワードを使用すると、そのスレッドが直接変数を読み込みますし、それをキャッシュしません。これは、スレッドが読み込み、変数がメモリに同じである同じであることを保証します。

18、同期方法とより良い選択である同期ブロック、?

それは(もちろんあなたはそれがオブジェクト全体をロックすることができます)オブジェクト全体をロックしていないため、同期ブロックは、より良い選択です同期メソッドは、オブジェクト全体をロックします、多くの場合、実行を停止するには、このオブジェクトのロックを取得するのを待つためにそれらをリードしており、このクラスが関連付けられていない複数のシンクブロックを持っている場合でも、。

19、どのようにデーモンスレッドを作成するには?

デーモンスレッドとしてスレッドを設定することができますは、setdaemon Threadクラス(true)メソッドを使用して、あなたは、start()メソッドを呼び出す前に、このメソッドを呼び出す必要があるに注意を払う必要があり、それ以外の場合は例外ないIllegalThreadStateExceptionがスローされます。

20. ThreadLocalのは何ですか?

ThreadLocalのスレッドがローカル変数を作成するために使用され、我々はことを知っているすべてのスレッドのオブジェクトは、そのグローバル変数を共有し、これらの変数は、スレッドセーフではありません、私たちは、シンクロナス・テクノロジを使用することができます。私たちは同期を使用しない場合でも、我々はThreadLocal変数を選択することができます。

各スレッドは、独自のスレッド変数を持って、彼らは彼らの雌ねじの値にそのデフォルト値や変更を取得するには、Get()\セット()メソッドを使用することができます。彼らは通常、スレッド状態に関連付けるThreadLocalのインスタンスは、プライベート静的プロパティです。

21.スレッドグループとは何ですか?なぜそれが推奨されますか?

スレッドグループはクラスで、その目的は、スレッドグループについての情報を提供することです。

スレッドグループのAPIが比較的弱い、それはスレッドよりも多くの機能を提供していません。これは2つの主要な機能を有する:第一に、スレッドの状態でアクティブなスレッド群のリストを取得し、第二のスレッドキャッチされない例外ハンドラ(ncaught例外ハンドラ)を設定することです。しかし、スレッドグループが古くなっているので、また、setUncaughtExceptionHandler(たuncaughtExceptionHandler EH)メソッドを追加したJava 1.5でThreadクラスでは、継続使用はお勧めできません。

t1.setUncaughtExceptionHandler(new UncaughtExceptionHandler(){

@Override
public void uncaughtException(Thread t, Throwable e) {
System.out.println("exception occured:"+e.getMessage());
}

});

22.それを取得する方法、Javaスレッドダンプ(スレッドダンプ)とは何ですか?

JVMのスレッドダンプは、それがシステムのボトルネックとデッドロックを分析するのに非常に有用である、アクティブなスレッドの一覧です。プロファイラ、キル-3コマンドを使用して、jstackツール - スレッドダンプを取得するには多くの方法があります。使いやすく、JDKに付属しているので、私はjstackツールを好みます。それは、端末ベースのツールであるため、私たちは、分析されるタイミングスレッドダンプを生成するために、いくつかのスクリプトを書くことができます。

23.デッドロック(デッドロック)とは何ですか?どのように分析し、デッドロックを回避するには?

デッドロックは永遠にブロックし、このような状況は、2つのスレッドとリソースをより少なくとも二つ以上を生成する必要が二つ以上のスレッドの場合を指します。

デッドロックの分析、我々はスレッドダンプJavaアプリケーションを参照してくださいする必要があります。私たちは、スレッドと、彼らが待っているリソースのそれらBLOCKED状態を見つける必要があります。各リソースには、一意のIDを持って、我々は独自のオブジェクトロックを持つスレッドを見つけることができますIDを使用します。

、ネストされたロックを避けるために必要な場合にのみロックし、無期限に待機して避けることは、デッドロックを回避するための通常の方法です。

24. JavaのTimerクラスとは何ですか?タスク特定の時間間隔を作成する方法?

java.util.Timerは、将来の特定の時点でのスレッドの実行を手配するために使用できるユーティリティクラスです。Timerクラスは、1回限りのタスクまたは定期的なタスクをスケジュールすることができます。

java.util.TimerTaskは、抽象クラスは、Runnableインタフェースを実装している、我々は我々自身のタイミングを作成し、その実行を手配するためにタイマータスクを使用するには、このクラスを拡張する必要があります。

25、スレッドプールは何ですか?Javaスレッド・プールを作成する方法?

スレッドプール管理ワーカースレッドのセットが、それはまた、配置のタスクのために実行されるのを待っているキューが含まれています。

java.util.concurrent.Executors java.util.concurrent.Executorは、スレッドプールを作成するために使用されるインタフェースの実装を提供します。ScheduledThreadPoolExecutorのスレッドプールの例が作成し、スレッドプールを使用するか、または定期的なタスクを作成する方法を学ぶために読みする方法の例を示しました。

二、のJava並行処理面接の質問

1.アトミック操作とは何ですか?どのクラス(アトミッククラス)原子のJava並行処理APIを持っていますか?

そうでない場合は、操作部タスクの動作に影響を与えていないアトミック操作を指します。データの矛盾を回避するためのアトミック操作がマルチスレッド環境であることを意味します。

INT ++は、スレッドがその値を読み取り、1を追加するときに、別のスレッドがエラーになります以前の値を、読んだことがあるかもしれない、アトミック操作ではありません。

この問題を解決するために、我々はこれを行うには同期技術を使用することができます前に、増加操作は、JDK1.5アトミックであることを確認する必要があります。JDK1.5に、は、java.util.concurrent.atomicパッケージがlong int型とラッパーの種類を提供し、彼らは自動的にその動作を保証することができる原子と同期を使用する必要はありません。

2.それがロック(ロック・インターフェース)でJava並行処理APIインターフェイスは何ですか?コントラスト同期はどんな利点があるのでしょうか?

ロックインタフェースは、同期方法よりも、ブロックを同期して、よりスケーラブルなロック操作を提供します。彼らは、より柔軟な構造を可能にする完全に異なる特性を有していてもよく、およびオブジェクトクラスに関連する複数の条件をサポートすることができます。

その利点は以下のとおりです。

  • あなたは公平ロックすることができます

  • スレッドがロックを待っているの応答時間を中断することができます

  • ことができますスレッドがロックを取得しようとすると、すぐにと、ロックを取得したり、いくつかの時間を待つことができない返します

  • 、異なる範囲で異なる順序でロックを取得し、解放することができます

3.エグゼキュータのフレームワークとは何ですか?

java.util.concurrent.Executorインターフェースとエグゼキュータ・フレームは、Java 5に内蔵されています。エグゼキュータのフレームワークは、非同期タスクの実行ポリシーの呼び出し、スケジューリング、実行および制御のセットに基づくフレームワークです。

無制限のスレッドを作成するアプリケーションのメモリオーバーフローを引き起こす可能性があります。あなたがスレッドの数を制限することができ、これらのスレッドを再利用することができますので、だから、スレッドプールを作成することは、よりよい解決策です。あなたは非常に簡単にエグゼキュータのフレームワークを使用してスレッドプールを作成することができます。

4、どのようなキューをブロックしていますか?消費者モデル - ブロッキングキューを使用するために生産を達成するためにどのように?

キューがいっぱいになったときにブロックされた、またはされ、キューが空の場合、取得またはキュー操作から要素を削除し、キューの操作要素に追加ブロックされます:Java.util.concurrent.BlockingQueue特性があります。

あなたはそれがNullPointerExceptionがスローした場合、空のキューに値を追加しようとすると、キューをブロックすると、null値を受け入れません。

実装は、すべてのクエリメソッドはアトミックであり、内部ロックまたは同時実行制御の他の形式を使用して、スレッドセーフなブロッキングキューです。

消費者問題 - BlockingQueueのインタフェースは、主に生産を実現するために使用されるJavaコレクションフレームワークの一部です。

5.呼び出し可能と未来とは何ですか?

Java 5のパッケージの同時実行java.util.concurrent.Callableインターフェースに導入され、およびインタフェースはRunnableをに似ていますが、それはオブジェクトを返すか、例外をスローすることができます。

その戻り値の型を定義するための呼び出し可能汎用インタフェース。執行クラスは、スレッド・プールに呼び出し可能な範囲内のタスクを実行するために、いくつかの便利なメソッドを提供します。並列で呼び出し可能なタスクので、我々はそれが返す結果を待つ必要があります。私たちはこの問題を解決するためのjava.util.concurrent.Futureターゲット。あなたがスレッドプールに呼び出し可能なタスクを提出した後、我々は呼び出し可能なタスクの状態と、呼び出し可能なリターンを得られた結果を知ることが可能な未来のオブジェクトを返します。我々は待って、それ結果のコーラブル終わり得ることができるように将来は、get()メソッドを提供します。

6. FutureTaskは何ですか?

FutureTaskは、将来の実装のための基礎であり、我々はエグゼキューと非同期タスクを処理するためにそれを使用することができます。オリジナルの基盤を達成し、維持するために、私たちは未来のインターフェースを書き直すつもりいくつかの方法があるとき、通常、我々は、単一の、FutureTaskクラスを使用する必要はありません、それは非常に便利になります。私たちはそれを継承し、私たちに必要なメソッドをオーバーライドすることができます。

7.並行性のコンテナとは何ですか?

Javaのコレクションクラスが設定が変更されたときにことを意味し、高速失敗し、スレッドのコレクションを反復処理を使用しているとき、イテレータのnext()メソッドは、例外ConcurrentModificationExceptionをスローします。

同時コンテナは、同時更新と同時トラバーサルをサポートしています。

メインクラスはConcurrentHashMapの、CopyOnWriteArrayListととCopyOnWriteArraySetがあります。

8.どのようなエグゼキュークラスですか?

執行は、ツールメソッドれたExecutor、ExecutorService、ScheduledExecutorService、ThreadFactory、呼び出し可能なクラスを提供します。

執行は簡単にスレッドプールを作成するために使用することができます。

フォローアップ。

 

おすすめ

転載: blog.csdn.net/MyronCham/article/details/90342679