()25 Threadクラス関連の面接の質問と回答:Javaのインタビューのハイライト

Javaのインタビューのハイライト:25 Threadクラス関連の面接の質問と回答().PNG

1.どのようなスレッドがありますか?どのようなプロセスがありますか?どちらの違いとの接触は何ですか?

(1)スレッドCPUの基本単位は、別々に独立して動作し、予定されている;(2)工程は、リソース割り当ての基本単位であり、両方のアプリケーションがリンクして実行されますプロセスおよびスレッドは、オペレーティングシステムのプログラム実行を実行していますベースユニット。

差:(1)独立したアドレス空間を用いて処理し、プロセスがクラッシュした後、保護モードで他のプロセスに影響を与えないであろう。(2)ダイのスレッドは、プロセス全体のダイに等しい場合、プロセスだけ異なる実行パススレッドは、スレッドは、それ自体のスタックとローカル変数を持っていますが、スレッド間で別々のアドレス空間は存在しません。

プロセスは、アプリケーションで実行され、スレッドは、プロセス内での実行の順序です。プロセスは複数のスレッドを持つことができます。呼ばれる軽量プロセスを通します。

各プロセスを通し、違いと短所は何ですか2.?

プロセスがリソース割り当ての最小単位であり、スレッドは、プログラム実行の最小単位です。

プロセスは、独自の別個のアドレス空間を有し、それぞれはプロセスを開始し、コードセグメント、スタックとデータセグメントを保持するデータテーブルを設定し、それのためにアドレス空間を割り当てるシステムは、この操作は非常に高価です。スレッドのオーバーヘッドは、プロセスよりもはるかに小さい作成中のプロセスよりもCPUの変更は、はるかに小さいスレッドをとるようにスレッドは、同じアドレス空間を使用して、共有のプロセスデータです。

スレッド、同じプロセスを共有グローバル変数、静的変数やその他のデータ内のスレッド、およびプロセス間通信との間のより便利な通信は、方法(IPC)通信で行います。しかし、どのように同期と相互排他を処理するためには、マルチスレッド・プログラムを書くことの難しさです。

しかし、長いスレッドのダイスがあるとしてプログラムより堅牢なマルチプロセス、マルチスレッドプログラム、全体のプロセスは、あまりにも、死んでいる、そしてプロセスは独自の個別のアドレス空間を持っているため、プロセスは、プロセスに影響を与えないであろう他のダイ。

記事を参照してください。

いくつかの異なる方法でスレッドを作成します。3.?あなたはどちらを好むのですか?なぜ?

スレッドを作成するための3つの方法があります。

継承されThreadたクラス

実装Runnableインタフェース

アプリケーションは、スレッドプールを作成するためのフレームワークを使用することができますキュータ

実装Runnable接口それが継承する必要がないので、この方法は、より人気のあるThreadクラスを。アプリケーション設計のケースでは、(しかし、Javaは多重継承をサポートしていません)のみのインタフェースを多重継承を要求する他のオブジェクトを、継承しています。同時に、スレッドプールはまた、非常に、効率的に実装し、使いやすいです。

スレッドの解釈4.は、いくつかの利用可能な状態を概説しますか?

実装プロセス内のスレッドは、いくつかの州では、次のことができます。

レディ(Runnableを):スレッドが実行する準備ができて、必ずしもすぐに実行を開始することができます。

実行(実行):ねじコード実行処理を。

待っている(待機):処理スレッドは、外側端を待って、ブロックされています。

スリープ(睡眠):スレッドがスリープ状態に強制されます。

I / Oは、(ON I / Oをブロックされた)ブロックされた:I / O操作が完了するまで待ちます。

(同期でブロック)同期ブロック:ロックの獲得を待っています。

死(死):スレッドが実行を終了します。

5.差分同期方法と同期ブロックとは何ですか?

Java言語では、各オブジェクトはロックされています。スレッドがオブジェクトのロックを取得するためにsynchronizedキーワードを使用することができます。synchronizedキーワードは、プロセス・レベル(粗粒ロック)またはコード・ブロック・レベル(きめ細かいロッキング)にも適用することができます。

それは多くても1つのスレッドが同じ期間内のコードを実行することを保証するために、方法または時間のブロックを変更するために使用するキーワードJava言語、。

(1)、この同期化(この)同期ブロック、実施される時間だけつのスレッドにアクセスするには、2つの並行スレッドで同一の対象物。別のスレッドがコードブロックの実装が完了した後に、コードブロックを実行するために、現在のスレッドを待たなければなりません。

(2)ただし、同期(本)同期ブロックのオブジェクトにアクセスするスレッドが、別のスレッドが依然として非同期(本)同期ブロック内のオブジェクトにアクセスすることができます。

スレッドが同期(本)同期ブロックのオブジェクトにアクセスする場合(3)は、特に重要であり、同期コード・ブロックにアクセスするための同期、他のすべてのスレッド(この)の別の目的は、ブロックされます。

(4)、同じことが第三のシンクブロックの他の例にも適用されます。すなわち、同期つのスレッドがオブジェクトにアクセスするときに(この)同期ブロックは、そのオブジェクトのロックこのオブジェクトを取得しました。結果として、オブジェクトの同期コードセクションのすべてのオブジェクトにアクセスするための他のスレッドが一時的にブロックされています。

(5)上記のルールは、他のオブジェクトのロックに適用されます。

スレッドの同期を行う方法内部のモニター(モニター)6.、?プログラムは、同期のどのレベルにすればよいですか?

Java仮想マシン内のモニターとロックが使用の作品です。唯一つのスレッドが同期ブロックを実行していることを保証する監視モニターシンクブロック、。モニタの各々とオブジェクト参照に関連付けられています。スレッドがロックを取得する前に、同期コードを実行することはできません。

7.デッドロック(デッドロック)とは何ですか?

デッドロックが発生するダウン継続して終了したときに両方のプロセスがお互いを待っています。結果は、2つのプロセスが無限の待機中に巻き込まれていることです。

デッドロックにつながるないながら8は、どのようにN、N個のスレッドがリソースにアクセスできることを確認するには?

ロックの獲得の順序を指定し、強制的に指定した順番でロック・スレッドを取得:複数のスレッドを使用する場合は、回避デッドロックに非常に単純な方法です。すべてのスレッドがロックと同じ順序でロックを解除している場合はこのように、それは登場デッドロックはありません。

9.どのようにデッドロックを回避するには?

マルチスレッドデッドロックのために必要な4つの条件:相互に排他的な条件:リソースのみプロセスで使用することができます。条件を維持し、要求:ときに、リソース要求によるプロセスと緊密に保管されているリソースへのアクセスを遮断しました。不可分のチューン:プロセスが完了する前に使用されていないリソースへのアクセスを持っている、それは拒否することはできません。ループ待ち状態:リソースを待っているいくつかのプロセス間の尾巡回関係に頭を形成します。

長いこれらの条件のいずれかの破壊などとして、あなたがデッドロックを回避することができ、そのうちの最も単純なループ条件を待っているの悪循環を断ち切ることです。オブジェクトにアクセスするのと同じ順序、ロードロックでは、ロックを解除します。

10. Threadクラス開始()とrun()メソッドの違いは何ですか?

start()メソッドは、作成されたスレッドの状態が実行可能となるように、新しいスレッドが作成される開始するために使用されます。あなたはrun()メソッドが唯一の元のスレッドに呼び出されるコールすると、新しいスレッドはstart()メソッドは、新しいスレッドを開始し、開始されません。私たちはスレッドのrun()メソッドを呼び出した場合、それは、通常と同じように行動直接実行()メソッドを実行します。新しいスレッドで私たちのコードを実行するためには、Thread.start()メソッドを使用する必要があります。

Runnableを、呼び出し可能11. Javaの違いは何ですか?

Runnableを、呼び出し可能は異なるスレッドで実行されるこれらのタスクを表します。初めそこJDK1.0のRunnableから、JDK1.5で呼び出し可能に増加しました。主な違いは、Callableを呼び出し()メソッドは値を返し、例外をスローですが、Runnableをrun()メソッドは、これらの機能を持っていません。呼び出し可能な未来のオブジェクトは、計算結果をロードし戻してもよいです。

12. Javaの何が競合状態にありますか?

最も実用的なマルチスレッドアプリケーションでは、2つの以上のスレッドが同じデータへのアクセスを共有する必要があります。私のスレッドが同じオブジェクトにアクセスし、各スレッドがオブジェクトの状態を変更するためのメソッドを呼び出す場合、何が起こるでしょうか?想像して、お互いの足にスレッドを辞任しました。スレッドの順番のデータにアクセスするによれば、破損したオブジェクトを引き起こす可能性があります。このような状況は、一般的に競合状態と呼ばれます。

スレッドを停止する方法13. Javaの?

Javaそれは豊富なAPIを提供しますが、スレッドを停止するためのAPIを提供していません。JDK 1.0いくつかは次のようにされているだろうstop()suspend()resume()制御方法が、デッドロックの潜在的な脅威の。JavaのAPIの設計者がスレッドを停止するために互換性があり、スレッドセーフな方法を提供しない後そのため、JDKの後続バージョンでは、それらは、放棄されています。ときrun()call()スレッドのメソッドを実行するときに自動的に手動でスレッドを終了したい場合は、あなたが使用することができ、終了しますvolatile終了するには、ブール変数をrun()ループしたり、割り込みスレッドのメソッドにタスクをキャンセルします。

14. Javaは通知にとのnotifyAll違いは何ですか?

1つの明らかな理由は、各オブジェクトがスレッドによって取得されたロックを有し、ロックは、Javaオブジェクト・レベルではなくスレッドレベルを提供するということです。スレッドがいくつかのロックを待機する必要がある場合、その後の感覚にオブジェクト待機()メソッドを呼び出します。スレッドがロックを待機しているThreadクラスで定義された待機()メソッドは、明らかにされていない場合。単純に、待機ので、入れて通知してnotifyAllロックがオブジェクトに属しているので、それらはObjectクラスで定義されているので、ロックレベルの操作です。

同時コレクション15.ジャワの同期したセットの違いは何ですか?

並行コレクションは、マルチスレッドと並行処理のセットが同期され、スレッドセーフなのに適したセットを提供は、しかし、高いスケーラビリティの集合によって複雑になります。Java1.5使用する前に、プログラマーやマルチスレッドの同時実行時における同期のセットのみのシステムの拡張を妨げ、競合を引き起こす可能性があります。Java5のような、同時のコレクションを紹介しConcurrentHashMap、スケーラビリティを向上させるために分離し、内部のパーティションや他の近代的な技術をロックし、スレッドの安全性を提供するだけでなく、。

16.スレッドプールとは何ですか?

スレッドプールは、マルチスレッド処理フォームは、管理することが引き渡さタスクを実行するタスク処理スレッドプールのスレッドプールに提出される予定です。各要求は、ハンドルにスレッドを作成する場合は、あなたが複数のタスクを実行することができ、サーバーのリソースはすぐに、多くの場合、スレッドプールのスレッドの作成を使用して、疲れになると破壊を低減することができ、各ワーカースレッドを再利用することができます。

17.なぜ、スレッドプールを使用できますか?

スレッドを作成し、スレッドの支出が比較的大きい破壊するのには、時間がビジネスに対処する時間よりも長くなることがあります。このような頻繁なスレッドの作成とスレッドの破壊、プラスビジネスワーカースレッドが時間のシステムリソースを消費し、それがシステムリソース不足につながる可能性があります。(私たちは、削除スレッドを作成し、破壊のプロセスを置くことができます)

18.役割スレッドプールとは何ですか?

スレッドプール機能は、システム内の実行スレッドの数を制限することです。

効率を改善するための1は、プール内のスレッドの一定数を作成し、そのプールからはるかに高速スレッドオブジェクトを作成するために必要なよりも、この時間を取得するために時間を使用する必要があります。

仕事にスレッドを割り当てるための要求があるときはいつでも同時101が発生した場合2は、経営管理の同じプールのスレッドプールスレッド管理コードを書くことができる容易にするために、例えば、起動時に100スレッドを作成するためのプログラムが、あります要求をキューに入れることができる余分は、無限の原因にクラッシュするようにシステムを回避するためにスレッドを作成することを要求します。

いくつかの一般的なスレッドプールと使用のシナリオについて19話?

図1に示すように、newSingleThreadExecutorシングルスレッドのスレッドプールを作成し、すべてのタスクが指定された順序(FIFO、LIFO、優先度)で行われることを保証するために、タスクのみワーカースレッドを実行するためだけにそれを使用。

2、newFixedThreadPool固定サイズのスレッドプールを作成し、あなたが同時スレッドの最大数を制御することができ、余分なスレッドは、キュー内で待機します。

3、 newCachedThreadPool長い場合は、治療の必要性よりもリサイクル可能でない場合は、新しいスレッドをアイドルスレッドを再利用するための柔軟性をキャッシュスレッドプール、スレッドプールを作成します。

4、newScheduledThreadPool定期的かつ周期的なタスクの実行をサポートするために、固定長のスレッドプールを作成します。

プール内のスレッドの20いくつかの重要なパラメータ?

corePoolSizeプール内のスレッドのコア数で、これらのコアスレッド、ただ無駄に時間に、それを回復することはないだろう

maximumPoolSize保持できるスレッドプール内のスレッドの最大数

keepAliveTimeスレッドプールでは、コアスレッド以外にも、タスクが存在しない状態でクリアすることができないため、コアスレッド以外に加えて、最長のスレッドプールの時間は、保持することができている、残りのすべての生存期間は、非コアスレッドは最長アイドル時間を予約することができることを意味します。util、それは単位の時間を計算することです。

workQueueキューを待っている、タスクが実行はFIFIO原理(FIFO)で、実行されるのを待っているタスクキューに格納することができます。

threadFactory、これは、スレッドのスレッドファクトリを作成することです。

handler、拒否戦略で、我々は完全なタスクの後に、特定のタスクを実行することを拒否することができます。

21.戦略スレッドプールについて話すことを拒否しましたか?

リクエストが進行中のタスク、およびシステム処理が、彼らが来た。この時が来たとき、私たちは政策を取る必要があるサービス拒否です。RejectedExecutionHandlerインタフェースは、ジョブの処理をカスタマイズする方法を拒絶する機会を提供します。ThreadPoolExecutorではすでに4つの処理戦略が含まれています。

  • AbortPolicy戦略:戦略は適切に動作からシステムを防止するため、投げを指示します。

  • CallerRunsPolicy戦略は:限り、スレッドプールが閉じていないと、呼び出し側のスレッドで直接政策は、現在のタスクが破棄されて実行されます。

  • DiscardOleddestPolicy戦略:この戦略は、タスクが実行される最も古い要求を破棄し、再度、現在のジョブを提出しようとします。

  • DiscardPolicy戦略:戦略は黙って廃棄作業は、任意の処理をせずに処理することはできません。

JDKの4種類に加えて、政策を否定する、私たちはカスタマイズするビジネスニーズに応じた戦略を拒否することができ、デフォルトで提供、カスタマイズされたアプローチが直接実装、シンプルでRejectedExecutionHandlerインタフェースが可能。

22.実行し、違いを提出しますか?

私たちの使命は、executeメソッドに加えて、使用される方法を実行することで、提出方法はまた、我々が提出したタスクを実行することができますがあります。

これらの2つの方法は、それがどのような違いを生むのでしょうか?それぞれ、どのようなシナリオの下でのために?私たちは、単純な分析を行います。

  • ただ、それを実行するスレッドプールのスレッドをスローするように、少ないシーンの戻り値が心配に適用され実行されます。

  • シナリオは、戻り値に焦点を当てる必要がありますするための方法が適切で提出

スレッドプールの使用シナリオの23 5種類?

  • newSingleThreadExecutor:シングルスレッドための必要なシナリオの実行を確実にするために使用することができるスレッドプール、および唯一の実行スレッド。

  • newFixedThreadPool:固定サイズのスレッドプールはないスレッドの数の公知の同時圧力限界の場合に使用することができます。

  • newCachedThreadPool:スレッドプールは、実行時間を処理するために無限に、より適切な展開することができ、比較的小規模な作業です。

  • newScheduledThreadPool:シーンは定期的にタスクを実行するために多くのバックグラウンドスレッドを必要とするため、スレッドプールを開始するには、開始時間を遅らせることができます。

  • newWorkStealingPool:複数のスレッドプールとタスクキューは、並列に実行するスレッドのCPU番号を作成するために現在利用可能な接続の数を減らすことができます。

24.どのようにスレッドプールを閉じますか?初期化スレッドプールのスレッドの数を選択してください?

閉じるスレッドプールはシャットダウンを達成するためにshutdownNowのと2つのメソッドを呼び出すことができます

shutdownNowの:タスクであることに、すべての廃止のすべての割込み()、タスクの停止実行がまだ開始されていない実行を行わず起動するタスクリストに戻ります。

シャットダウン:我々はシャットダウンを呼び出すと、スレッドプールは、もはや新しいタスクを受け入れないでしょうが、提出されたか、タスクが実行されて終了することを強制されることはありません。

タスクは、IOが集中的である場合には、一般的な必要性にあるスレッドの数は、CPUリソースを最大限に活用するためには、CPUの2倍以上の数を設定します。

タスクは、CPU集約型である場合、一般的にのみだけでコンテキストスイッチの数を増やすことができます多くのスレッドを追加することができますCPU 1の数を設定する必要があるスレッドの数は、CPU使用率が増加することはできません。

これらは、あなたが本当にオンライン、正確な制御を必要とするか、または可能にするキューとスレッドのプール内のスレッドの数を観察する必要が後であれば、単に基本的な考え方です。

25.作業キューを持つスレッドプールのどのような?

1、ArrayBlockingQueue

アレイの構成に基づいてキューFIFO(先入れ先出し)原則ソート要素をキューこれを阻止する有界。

図2は、LinkedBlockingQueueブロッキングリストキュー構造に基づいて、このキューはFIFO(先入れ先出し)は、通常より高い一定ArrayBlockingQueueより、要素を照合。静的ファクトリメソッドExecutors.newFixedThreadPoolは()このキューを使用しています

3、SynchronousQueue

ブロックキュー要素が格納されていません。別のスレッドが削除操作呼び出し、または挿入操作は通常高いLinkedBlockingQueueよりも、静的ファクトリメソッドは、このキューを使用Executors.newCachedThreadPoolスループットブロックされた状態になっているまで、各挿入操作を待たなければなりません。

4、PriorityBlockingQueue

プライオリティキューは無制限の障害物を持っています。

勧告

(詳細な分析と)メーカー書かれたコンテンツの収集継続的に....で更新

ProcessOn集約プラットフォームは、オンラインマッピングツールであります -

文末

個人的なマイクロチャネル公衆番号へようこそ注意:プログラミングCoderの歓迎の注意コーダーをプログラミング公共番号、メインの共有データ構造とアルゴリズムを、Java関連の知識、知識や原則の枠組み、春の家族のバケット、マイクロサービスは、道路の戦闘、DevOpsチームの実践、一日を予測しますインターネットの巨大なペン記事やインタビューの質問とPMPプロジェクトマネジメント知識。よりエキサイティングなコンテンツが途中である- QQグループ建て:211 365 315は、私たちが一緒にグループ交換研究に歓迎します。ありがとうございます!また、必要としている友人の側に導入することができます。

GitHubのに付属の記事:github.com/CoderMerlin ... Gitee:gitee.com/573059382/c ...歓迎の注意と星〜

マイクロチャンネル公衆数

おすすめ

転載: juejin.im/post/5dd39e1be51d453fd16b196c