この記事は、将来遭遇する問題に対応するために、Javaマルチスレッドの基本的な知識を習得するのに役立ちます。特定のコンテンツは次のとおりです
1。Javaマルチスレッドインタビューの質問
1.プロセスとスレッドの違いは何ですか?
プロセスは、プログラムまたはアプリケーションと見なすことができる自立した実行環境です。スレッドは、プロセスで実行されるタスクです。 Javaランタイム環境は、さまざまなクラスとプログラムを含む単一のプロセスです。スレッドは、軽量プロセスと呼ぶことができます。スレッドでは、プロセスに作成および居住するためのリソースが少なくなり、プロセスでリソースを共有できます。
2。マルチスレッドプログラミングの利点は何ですか?
マルチスレッドプログラムでは、プログラムの効率を改善するために複数のスレッドが同時に実行され、特定のスレッドがリソースを待つ必要があるため、CPUはアイドル状態に入りません。複数のスレッドがヒープメモリを共有するため、複数のスレッドを作成していくつかのタスクを実行することは、複数のプロセスを作成するよりも優れています。たとえば、サーブレットはマルチスレッドをサポートしているが、CGIはそうではないため、サーブレットはCGIよりも優れています。
3.ユーザースレッドとデーモンスレッドの違いは何ですか?
Javaプログラムでスレッドを作成すると、ユーザースレッドと呼ばれます。デーモンスレッドは、バックグラウンドで実行され、終了したJVMをブロックしないスレッドです。ユーザースレッドが実行されていない場合、JVMはプログラムを閉じて終了します。デーモンスレッドによって作成された子スレッドは、まだデーモンスレッドです。
4.どのようにスレッドを作成しますか?
スレッドを作成するには2つの方法があります。1つは、実行可能なインターフェイスを実装し、スレッドコンストラクターに渡して、スレッドオブジェクトを作成することです。もう1つは、スレッドクラスを直接継承することです。詳細については、Javaでスレッドを作成する方法に関するこの記事を読むことができます。
5.異なるスレッドライフサイクルは何ですか?
Javaプログラムで新しいスレッドを作成すると、そのステータスは新しいものです。スレッドのstart()メソッドを呼び出すと、状態は実行可能に変更されます。スレッドスケジューラは、実行可能なスレッドプールのスレッドにCPU時間を割り当て、状態を実行に変更します。他のスレッド状態には、待機、ブロック、および死亡が含まれます。この記事を読んで、スレッドライフサイクルの詳細をご覧ください。
6.スレッドクラスのrun()メソッドを直接呼び出すことはできますか?
もちろん、スレッドのrun()メソッドを呼び出すと、通常の方法と同じように動作します。新しいスレッドでコードを実行するには、thread.start()メソッドを使用する必要があります。
7.ランニングスレッドを一定期間一時停止する方法は?
スレッドクラスのSleep()メソッドを使用して、一定期間スレッドを一時停止できます。これにより、スレッドが終了しないことに注意する必要があります。スレッドが冬眠から目覚めると、スレッドの状態が実行可能に変更され、スレッドのスケジューリングに従って実行されます。
8。スレッドの優先順位についてのあなたの理解は何ですか?
各スレッドには優先順位があります。一般的に言えば、実行時に優先度の高いスレッドが優先されますが、これはオペレーティングシステム(OS依存)に関連するスレッドスケジューリングの実装に依存します。スレッドの優先度を定義できますが、これは、優先度の高いスレッドが低優先度のスレッドの前で実行されることを保証するものではありません。スレッドの優先順位はint変数(1〜10から)、1は最優先度を表し、10は最高の優先度を表します。
9.スレッドスケジューラと時間のスライシングとは何ですか?
スレッドスケジューラは、実行可能な状態のスレッドにCPU時間を割り当てる責任があるオペレーティングシステムサービスです。スレッドを作成して起動すると、その実行はスレッドスケジューラの実装に依存します。タイムシャードとは、利用可能なCPU時間を利用可能な実行可能スレッドに割り当てるプロセスを指します。割り当てられたCPU時間は、スレッドの優先度またはスレッドの待機時間に基づいています。スレッドスケジューリングはJava仮想マシンによって制御されていないため、アプリケーションによって制御する方が良いです(つまり、プログラムがスレッドの優先順位に依存しないようにします)。
10。マルチスレッドでは、コンテキストスイッチングとは何ですか?
コンテキストスイッチングは、CPU状態を保存および復元するプロセスであり、スレッドの実行が割り込みポイントから実行を再開できるようにします。コンテキストスイッチングは、マルチタスクオペレーティングシステムとマルチスレッド環境の基本的な機能です。
11. Main()メソッドが配置されているスレッドがJavaプログラムで終了する最後のスレッドであることをどのように確認しますか?
スレッドクラスのジョイント()メソッドを使用して、メイン()メソッドが終了する前にプログラムによって作成されたすべてのスレッドが終了することを確認できます。スレッドクラスの共同()メソッドに関する記事を次に示します。
12.スレッドはどのように通信しますか?
スレッド間リソースを共有できる場合、スレッド間通信はそれらを調整するための重要な手段です。オブジェクトクラスのwait()/notify()/notifyall()メソッドを使用して、リソースに関するロックの状態に関するスレッド間で通信できます。 Thread Waitの詳細については、ここをクリックしてください。
13.スレッド通信メソッドは、オブジェクトクラスで定義されている()、notify()、およびnotifyall()がなぜwait()、notifyall()があるのですか?
Javaの各オブジェクトには、ロック(モニター、モニターにすることもできます)とwait()、Notify()、およびその他のメソッドを使用して、オブジェクトのロックを待つか、他のスレッドオブジェクトを使用できるように通知します。 Javaスレッドで使用するオブジェクトが使用できるロックとシンクロニザーはありません。これが、これらの方法がオブジェクトクラスの一部である理由であるため、Javaのすべてのクラスにはスレッド間通信のための基本的な方法があります
14.なぜwait()、notify()、およびnotifyall()を同期方法または同期ブロックで呼び出す必要があるのですか?
スレッドがオブジェクトのwait()メソッドを呼び出す必要がある場合、スレッドにはオブジェクトのロックが必要です。次に、オブジェクトのロックを解放し、他のスレッドがオブジェクトのnotify()メソッドを呼び出すまで待機状態に入ります。同様に、スレッドがオブジェクトのnotify()メソッドを呼び出す必要がある場合、オブジェクトのロックを取得するために他のスレッドが待機するようにオブジェクトのロックを放出します。これらのすべてのメソッドは、オブジェクトのロックを保持するためにスレッドを必要とするため、同期によってのみ実装することができるため、同期メソッドまたは同期ブロックでのみ呼び出されます。
15.スレッドクラスのspeek()およびried()メソッドが静的なのはなぜですか?
スレッドクラスのsleep()およびevel()メソッドは、現在実行中のスレッドで実行されます。したがって、これらのメソッドを待機状態にある他のスレッドで呼び出すことは意味がありません。そのため、これらの方法は静的です。彼らは現在実行中のスレッドで動作し、これらの方法を他の非実行スレッドで呼び出すことができるというプログラマーの誤った信念を避けることができます。
16.スレッドの安全性を確保する方法は?
Javaのスレッドの安全性を確保する方法は、多くの方法があります - 同期 - アトミックコンカレントクラスの使用、同時ロックの実装、揮発性キーワードの使用、不変クラスの使用、スレッドセーフクラスを使用します。詳細については、スレッド安全チュートリアルをご覧ください。
17. Javaの揮発性キーワードの役割は何ですか?
揮発性キーワードを使用して変数を変更すると、スレッドは変数を直接読み取り、キャッシュしません。これにより、スレッドで読み取られる変数がメモリで一貫していることが保証されます。
18.シンクロナイゼーション法または同期ブロック、より良い選択はどれですか?
同期ブロックは、オブジェクト全体をロックしないため、より良い選択です(もちろん、オブジェクト全体をロックすることもできます)。同期メソッドは、クラスに複数の無関係な同期ブロックがある場合でも、オブジェクト全体をロックします。これにより、通常は実行を停止し、オブジェクトのロックを取得するのを待つ必要があります。
19.デーモンスレッドを作成する方法は?
スレッドクラスのSetDaemon(True)メソッドを使用して、SetDaemon(True)メソッドを使用して、スレッドをデーモンスレッドとして設定します。 start()メソッドを呼び出す前にこの方法を呼び出す必要があることに注意する必要があります。そうしないと、IllegalthreadstateExceptionがスローされます。
20。Threadlocalとは何ですか?
Threadlocalは、スレッドのローカル変数を作成するために使用されます。オブジェクトのすべてのスレッドがグローバル変数を共有することを知っているため、これらの変数はスレッドセーフではなく、同期技術を使用できます。しかし、同期を使用したくない場合は、threadlocal変数を選択できます。
各スレッドには独自のスレッド変数があり、get()/set()メソッドを使用してデフォルト値を取得したり、内部で値を変更したりできます。通常、Threadlocalインスタンスは、それらをプライベート静的属性としてthread状態に関連付けることを望んでいます。この記事では、Threadlocalに関する小さなプログラムを見ることができます。
21.スレッドグループとは何ですか?なぜ推奨されないのですか?
ThreadGroupは、スレッドグループに関する情報を提供することを目的とするクラスです。
ThreadGroup APIは比較的弱く、スレッドよりも多くの機能を提供しません。 2つの主な機能があります。1つは、スレッドグループ内のアクティブスレッドのリストを取得することです。もう1つは、スレッド用の無作法な例外ハンドラーを設定することです。ただし、Java 1.5では、ThreadクラスはSetuncaughtExceptionHandler(UncaughedExceptionHandler EH)メソッドも追加されているため、スレッドグループは古くなり、使用を続けることはお勧めしません。
t1.setuncaughtexceptionhandler(new caughtexceptionhandler(){@override public void uncaugtexception(thread t、throwable e){system.out.println( "例外が発生:"+e.getmessage();}}); 22. Javaスレッドダンプとは何ですか?
スレッドダンプは、システムのボトルネックとデッドロックの分析に非常に役立つJVMアクティブスレッドのリストです。スレッドダンプを取得するには多くの方法があります - プロファイラー、Kill -3コマンド、JSTackツールなどを使用しています。JSTackツールを使いやすく、JDKが付属しているためです。端末ベースのツールであるため、分析のためにタイムリーにスレッドダンプを生成するためにいくつかのスクリプトを記述できます。このドキュメントを読んで、スレッドダンプの生成の詳細をご覧ください。
23。デッドロックとは何ですか?デッドロックを分析して回避する方法は?
デッドロックとは、3つ以上のスレッドが永遠にブロックされる状況を指します。この状況には、少なくとも2つのスレッドと2つ以上のリソースが必要です。
デッドロックを分析するには、Javaアプリケーションのスレッドダンプを表示する必要があります。状態がブロックされているスレッドと、彼らが待ち望んでいるリソースを見つける必要があります。各リソースには一意のIDがあります。このIDを使用して、どのスレッドにオブジェクトロックがあるかを確認できます。
ネストされたロックを避け、必要な場所でロックのみを使用し、無期限の待機を避けることは、デッドロックを避けるための通常の方法です。この記事を読んで、デッドロックの分析方法を学びましょう。
24。Javaタイマークラスは何ですか?特定の時間間隔でタスクを作成する方法は?
Java.util.timerは、将来の特定の時間に実行するためにスレッドをスケジュールするために使用できるツールクラスです。タイマークラスは、1回限りのタスクまたは定期的なタスクをスケジュールすることで配置できます。
Java.util.timertaskは、実行可能なインターフェイスを実装する抽象クラスです。このクラスを継承して、独自のタイミングのあるタスクを作成し、タイマーを使用して実行を手配する必要があります。
25。スレッドプールとは何ですか? Javaスレッドプールを作成する方法は?
スレッドプールはワーカースレッドのセットを管理し、実行されるのを待っているタスクを配置するためのキューも含まれています。
java.util.concurrent.executorsは、スレッドプールを作成するためのjava.util.concurrent.executorインターフェイスの実装を提供します。スレッドプールの例は、スレッドプールの作成と使用方法を示しているか、スケジュールされたthreadpoolexecutorの例を読んで、定期的なタスクを作成する方法を学習します。
2。Java同時インタビューの質問
1。原子動作とは何ですか? Java Concurrency APIにはどのような原子クラスがありますか?
原子操作とは、他の操作の影響を受けない操作タスクユニットを指します。原子操作は、マルチスレッド環境でのデータの矛盾を回避するために必要な手段です。
Int ++は原子動作ではないため、スレッドがその値を読み取って1を追加すると、別のスレッドが以前の値を読み取ることができ、エラーが発生します。
この問題を解決するには、添加操作がアトミックであることを確認する必要があり、同期テクノロジーを使用してJDK1.5の前にこれを行うことができます。 JDK1.5に、java.util.concurrent.atomicパッケージは、intおよび長いタイプのロードクラスを提供します。
2。Java Concurrency APIのロックインターフェイスは何ですか?同期を比較することの利点は何ですか?
ロックインターフェイスは、同期方法と同期ブロックよりもスケーラブルなロック操作を提供します。それらは、より柔軟な構造を可能にし、完全に異なる特性を持つことができ、複数の関連するクラスの条件付きオブジェクトをサポートできます。
その利点は次のとおりです。
ロックをより公平にすることができ、スレッドがロックを待っているときに割り込みに応答し、スレッドがロックを取得しようとするようにし、ロックを取得できないときや一定期間待つことができない場合にすぐに戻ることができます。
3。執行者のフレームワークは何ですか?
エグゼキューターフレームワークは、java.util.concurrent.executorインターフェイスを使用してJava 5に紹介されています。エグゼクティアフレームワークは、ポリシーコール、スケジュール、実行、および制御を実行する非同期タスクを実行するフレームワークです。
無制限の作成スレッドは、アプリケーションメモリオーバーフローを引き起こす可能性があります。したがって、スレッドプールの作成は、スレッドの数が制限され、スレッドの数をリサイクルして再利用できるため、より良いソリューションです。エグゼキューターフレームワークを使用すると、スレッドプールを簡単に作成できます。この記事を読んで、エグゼキューターフレームワークを使用してスレッドプールを作成する方法を学びます。
4.ブロッキングキューとは何ですか?ブロッキングキューを使用してプロデューサー - 消費者モデルを実装する方法は?
java.util.concurrent.blockingQueueの機能は次のとおりです。キューが空の場合、キューから要素を取得または削除する操作がブロックされます。
ブロッキングキューはヌル値を受け入れず、キューにnull値を追加しようとすると、nullpointerexceptionがスローされます。
ブロッキングキューの実装はスレッドセーフであり、すべてのクエリメソッドはアトミックであり、内部ロックまたはその他の形式の同時制御を使用します。
BlockingQueueインターフェイスは、主にプロデューサー消費者の問題を実装するために使用されるJava Collections Frameworkの一部です。
5。何が呼ばれ、未来は何ですか?
Java 5は、Concurrencyパッケージにjava.util.concurrent.callableインターフェイスを紹介します。実行可能なインターフェイスに非常に似ていますが、オブジェクトを返したり、例外をスローすることができます。
呼び出す可能性のあるインターフェイスは、ジェネリックを使用してリターンタイプを定義します。 executorsクラスは、スレッドプールで呼び出すことができるタスクを実行するためのいくつかの便利な方法を提供します。呼び出し可能なタスクは並行しているため、結果が戻ってくるのを待つ必要があります。 java.util.concurrent.futureオブジェクトは、私たちのためにこの問題を解決します。スレッドプールが呼び出し可能なタスクを送信すると、将来のオブジェクトが返されます。それを使用して、コール可能なタスクのステータスを知ることができ、コール可能なものによって実行された結果を返します。 Futureは、Callableが終了して実行結果を取得するのを待つことができるget()メソッドを提供します。
6. FutureTaskとは何ですか?
FutureTaskは将来の基本的な実装であり、エグゼクティブと一緒に使用して非同期タスクを処理できます。通常、FutureTaskクラスを使用する必要はありません。将来のインターフェイスの方法を書き直して元の基本的な実装を維持する予定がある場合に非常に便利になります。私たちはそれから継承するだけで、必要な方法を書き直すことができます。
7.同時コンテナの実装は何ですか?
Javaコレクションクラスはすべて迅速に失敗します。つまり、セットが変更され、スレッドがイテレーターを使用してセットをトラバースすると、Iteratorの次の()メソッドは同時モジーフィニゼーションの例外をスローします。
同時コンテナは、同時トラバーサルと同時の更新をサポートします。
メインクラスは、Concurrenthashmap、copyonwritearraylist、copyonwritearraysetです。この記事を読んで、ConcurrentModificationExceptionを避ける方法を学びます。
8。執行者のクラスは何ですか?
執行者は、執行者、executorservice、ScheduleDexecutorService、ThreadFactory、およびCallableクラスにいくつかのツール方法を提供します。
執行者を使用して、スレッドプールを便利に作成できます。
実際、より多くの基本的なJavaインタビューの質問があり、それらを体系的に整理することができます。
誰もがインタビューで成功することを願っています!