2020年春の募集Javaのインタビューの質問の要約「3」

序文

ホームオフィスでの最初のN日、今日の事はより遅く、やや更新され、私たちは今日あなたと共有することを1容赦インタビューの内容の当社第三章です!

友人の前に2件の記事を読む、今日の内容も非常に重要です!〜乾燥に直接、古い諺に少しビープ音を落とさないでください!

私はあなたが今日のコンテンツを好きなことを願っています

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

プロセスは、プログラムの実行の過程でプログラムを実行するためのシステムの基本的な単位です。システムは、作成、実行、消滅プロセスからプロセスでプログラムが実行されています。

メインスレッドは、メインスレッドとして知られているこのプロセスの機能、スレッドである一方、Javaでは、我々は起動時に主な機能は、JVMのプロセスを開始します。

プロセスは、その実行中に複数のスレッドを生成することができる、スレッドおよびプロセスは類似しているが、スレッドは、実行プロセスよりも小さい単位です。違いは、同じプロセスの複数のスレッドで共有プロセスヒープおよびメソッド領域リソースであることです。しかし、各スレッドは、独自のプログラム・カウンタがあり、仮想マシン、およびネイティブメソッドスタックを積み重ね、そのシステムは、スレッドを生成し、またはだけでなく、このため、より小型の負担よりもスレッドの作業プロセスを切り替えるとするときまた、スレッド軽量プロセスとして知られています。

2.してください簡単にはスレッドとプロセス間の関係、および長所と短所の違いを説明しますか?

プロセスとスレッド間の関係のイラスト

図から分かるように:プロセスが複数のスレッドを持つことができ、複数のスレッドは、プロセスヒープおよびメソッド領域リソース(JDK1.8後に元の空間)を共有するが、各スレッドはそれ自身のプログラムカウンタ、仮想マシンのスタックを有していますそしてネイティブメソッドスタック。

要約:スレッドが小さい動作単位に分割する処理です。プロセス内の同じスレッドがお互いに影響を与える可能性があるため、実質的に各工程の独立した各スレッドであるスレッドとプロセスとの間の最大の違いは、必ずしもありません。プロセス反し、スレッドの実行がオーバーヘッド小さいが、管理や資源の保護を助長されていません

なぜ、プログラムカウンタは、プライベートで?

プログラムカウンタは、以下の2つの機能です。

実行、選択サイクル、例外処理の順序:プログラムカウンタインタプリタバイトコードを順次ようなフロー制御コードを達成するために、命令を読み取ることによって変更されます。

スレッドがスイッチバックされたときに複数のスレッドの場合、現在のスレッドを実行するためのプログラムカウンタの記録位置は、それほどにどこスレッドが最後に実行を知っていること。

あなたがネイティブメソッドを実行した場合、その後、プログラムカウンタレコードは未定義アドレス、プログラムカウンタのJavaコードレコードのアドレスであり、次の命令の実行のみである、ことに注意してください。

==「スレッドコンテキストの切り替え?

これを達成するために、各スレッド機構にCPUのタイムスライスを割り当てることによりCPU。CPUタイムスライスがのは、複数のスレッドが同時に感じて実行させ、絶えず切り替えるスレッドによるCPUの実行時間が非常に短い作品ですので、ので、時間の各スレッドに割り当てられ、タイムスライスは、通常、数十ミリ秒(ミリ秒)です。

これは、タスクのタイムスライス、現在のタスクの実行のタイムスライスを実行するためにCPUサイクルで次のタスク割り当てアルゴリズムに切り替わります。しかし、スイッチの前に次の状態は、このタスクに切り替えるためにそうすることを、タスクの状態を保存し、再ロードするプロセスをタスクから保存再びロードすることができ、このタスクは、コンテキスト・スイッチです。

複数のスレッドで、プログラムカウンタは、スレッドの切り替えにプライベートプログラムカウンタが正しい実行位置に戻すことができ、主に後に、従って、現在の実行スレッドの位置を記録するために使用されます。

VMスタックおよびネイティブメソッドスタックはなぜ民間のでしょうか?

VMスタック:各Javaメソッドは、店舗情報テーブルにスタックローカル変数の実装のために同じ時間枠内に作成され、オペランドスタック、定数プールの参照など。呼処理方法の実行が完了するまで、それは、Java仮想マシン内のスタックのスタックフレームを押すとポップの処理に相当します。

ネイティブメソッドスタック:スタックと仮想マシンが役割と非常に類似しており、違いは次のとおりです(つまりバイトコード)は、Java仮想マシンのVMのスタック方法を実行するためのサービス、ネイティブメソッドスタック、仮想マシンのネイティブサービスのメソッドを使用します(例えば、これを達成する方法として、非コールインタフェースのJavaのJavaコードは、Cすることによって達成されます)。HotSpot仮想マシンと組み合わせたJava仮想マシンスタックで。

したがって、ローカル変数が他のスレッドにアクセスすることはできませんスレッドを確保するため、仮想マシンのスタックおよびスタックにネイティブメソッドは、スレッドプライベートです。

3.デッドロックを回避する方法は?スレッドのデッドロックとは何ですか?

複数のスレッドが(互いに待ち)によって引き起こされるリソースの競合するので、いわゆるデッドロックは、デッドロックを指し、

例:リソースを処理するスレッドが経営資源を呼び出す必要がBの同時処理スレッドB、Bのビジネスを呼び出すために必要な一方で、スレッド、業務を処理BスレッドB、との業務提携は、両サイドには、これにより、他のリソースの解放を待っていますデッドロックにつながります。

デッドロックを避けます:

限り、我々はそれのいずれかでデッドロックの4つの条件を破壊するとして。

相互に排他的な条件の破壊

我々は彼らが常に相互に排他的となってロック(必要な重要なリソースへの排他的アクセス)を使用したいので、この状態では、我々は破壊することはできません。

破壊要求保持状態

すべてのリソースのワンタイムアプリケーション。

損傷は条件を奪われていません

スレッドには、対象とならない場合、それは占有リソースを解放するためのイニシアチブをとることができ、さらに他の資源を申請するいくつかのリソースを取ります。

循環待ち状態の破壊

オンデマンドの防止にアプリケーションリソースを。特定の順序のアプリケーションのリソースは、リソースが逆順のリリースでリリースされています。循環待ち状態の破壊。

  1. スレッドスリープ()メソッドと待機()メソッドの相違点と類似点をお話しするには?

睡眠方法は、ロックを解除しないと、waitメソッドがロックを解除する:両方の主な違いは、ということです。

どちらも、実行スレッドを一時停止することができます。

典型的には、スレッド間の相互作用/通信のために使用される待ち、睡眠は、しばしば、実行を一時停止するために使用されます。

待機()メソッドが呼び出された後、スレッドは自動的に他のスレッドが同じオブジェクト()またはのnotifyAll()メソッドを呼び出して通知する必要がある、目を覚ますことはありません。睡眠()メソッドの実行が完了すると、スレッドは自動的に復帰します。それとも、自動的に起動しますが、タイムアウトスレッド後の待ち時間(長いタイムアウト)を使用することができます。

5.なぜ我々は()メソッドは、なぜ我々は直接run()メソッドを呼び出すことができない場合run()メソッドを実行開始を呼ぶのですか?(クラシック)

新しいスレッドは、スレッドが新しい状態に入り、コールstart()メソッドを使用して、実行を開始することができた後のタイムスロットに割り当てられたときに、レディ状態にスレッドとスレッドを開始します。真のマルチスレッド作業である、()は、適切な製剤のスレッドを実行し、その後、自動的に(コンテンツの方法)を実行する実行開始。直接実行run()メソッドは、この方法は、実行するためにメインスレッドに一般的な方法として実行され、それはスレッドで実行されないので、これは、マルチスレッド作業ではありません。

概要:startメソッドは、それらがスレッドと準備状態にスレッド、およびrunメソッド普通のスレッドのメソッド呼び出しを開始する前に呼び出され、あるいはメインスレッドで実行されます。

  1. synchronizedキーワード

1、synchronizedキーワードの自分の理解について話をします

この溶液を複数のスレッド同期の間でリソースにアクセスするキーワード同期されて、あなただけのスレッドで実行することができ、彼はいつでも方法やコードのブロックを変更保証することができます。

さらに、1.6の前に早期の低効率の同期、ヘビー級ロックが属しています。1.6達成ロックがロックを排除するために、例えばスピンロックスピンロック適応性として、最適化の多くを導入し、ロック操作のオーバーヘッドを減らすためにバイアスされ、ロック、軽量ロック技術を粗くロックは、今同期効率も非常によく最適化されています。

2、彼はsynchronizedキーワードを使用している方法についての話は、このプロジェクトではまだ使用します

3通りの方法で使用される主なsynchronizedキーワード:

方法の変形例:現在のロック・オブジェクト・インスタンスを取得するために同期コードを入力する前に、ロックオブジェクトの現在のインスタンスに適用されます

変更された静的メソッド:静的メンバーはクラスメンバーは、(静的がどんなに多くの新しい、これは静的リソースのクラスであることを示し、オブジェクトの任意のインスタンスに属していないため、現在のクラスをロックすることで、クラスのすべてのオブジェクトインスタンスに適用されますオブジェクト、一つだけ)。スレッドAの非静的同期メソッドは、メソッドがオブジェクトインスタンスのクラスに属する同期この静的を呼び出すためにオブジェクトのインスタンス、およびスレッドBのニーズを呼び出すのであれば、アクセス静的な同期メソッドのロックが占有されているため、相互排除は、発生しません、許可されています現在のクラス・ロックは、非静的メソッド同期ロックへのアクセスは、オブジェクトロックの現在のインスタンスによって占有されています。

変性ブロック:指定されたロックオブジェクトは、オブジェクトの所定のロックを取得するために、同期コードライブラリに入る前に、指定されたオブジェクトをロックします。

要約:同期静的キーワードは静的メソッドに追加され、コードブロックがクラスクラスにロックされている(クラス)同期。オブジェクトインスタンスに追加synchronizedキーワードの例としては、ロックされています。JVMは、文字列定数プールは、キャッシュ機能を持っているので、同期(列A)を使用しないようにしよう!

ダブルロックオブジェクトをチェック実装シングルトンその(スレッドセーフ)

最初のチェック:シングルトンインスタンスが作成されてから一度だけ、コールバックメソッドのgetInstanceを再度、単に従って最も大幅に改善された性能を有する符号同期方法を実行するために必要な時間の以前に作成されたインスタンスを返し、場合。最初にチェックしない場合は、トップ怠惰なモードで、ロックを競争するたびに違いはありません。

第2のチェック:最初のチェックのT1のスレッドの実行を想定し、何ら第2のチェックがない場合、それは、また、最初に行われる検査判定ヌル、時刻t2もCPUを実行する権利を取得し、判定されましたまた、nullです。次にt2は、ロックを取得し、インスタンスを作成します。最初のチェックが行われていた前のt1は、原因エグゼクティブパワーCPUを与えられたこの時点で、結果はインスタンスを作成するために、ロックを取得した後、ヌル(再び判断してはいけない)、です。結果は、複数のインスタンスを作成するためにつながります。インスタンスが空の場合、作成され、第二の同期コードをチェックする必要があります。

これは、民間の揮発性の静的なシングルトンuniqueInstanceに留意しなければならない、そうでない場合はエラーが発生します、揮発性のキーワードを追加する必要があります。JVMの命令が問題の原因再配置の最適化が存在するということです。コンストラクタが呼び出される前に、あなたがスレッドで、シングルトンオブジェクトを作成すると、デフォルト値にオブジェクトとオブジェクトフィールドのためのメモリ空間を割り当てます。この時点では、フィールドのインスタンスに割り当てられたメモリアドレスを割り当てることができますが、オブジェクトが初期化されない場合があります。正しい目的ではない状態を取るために、のgetInstanceを呼び出すために、別のスレッドが続いた場合、プログラムが間違って行くでしょう。

3、最適化の後に行われていたもののsynchronizedキーワードJDK1.6底についての話は、あなたがこれらの最適化を詳細に説明することができます

JDK1.6ロックは、バイアスされたロック、軽量ロック、スピンロック、適応スピン・ロックのような最適化の導入数を達成し、ロック操作のオーバーヘッドを低減する技術を粗く除去ロックをロックします。

4つの主要なロック状態は順番に、ありません:なしロック状態は、ロック状態、ロック状態、軽量、ヘビー級ロック状態に傾向があり、彼らは激しい競争とエスカレートしてなります。ロックがダウングレードアップグレードすることはできませんが、この戦略は、取得と解放ロックの効率を改善することです。

図1に示すように、バイアスされたロック

軽量の導入のような多くの偏ったロックとロックの目的を導入する目的、彼らは伝統的なヘビー級のパフォーマンスのオペレーティングシステムのロックミューテックスの農産物の消費量を削減、競争のマルチスレッド前提の不在のためのものです。しかし、違いがある:CASを使用した軽量ロックが使用ミューテックスを置き換えるために競争ケースなしで動作します。競争的な状況が存在しない場合にバイアスされ、ロックは、全体の同期を排除しているだろう。

「バイアス」のバイアスされたロックが偏心側で次の実行で、ロックが別のスレッドによって取得されていない場合、その手段は、スレッドがロックバイアスを保持し、それを最初のスレッドを取得する傾向がありますあなたは同期する必要はありません!偏ったロック原則は、「Java仮想マシンの深い理解:JVMは、機能やベストプラクティスを進める」見ることができる第二版、第13章節ロックの最適化を。

しかし、もっと激しい場所ロックの競争、失敗した場合にロックバイアス、この状況はおそらく、アプリケーションごとにスレッドをロックすることですので、異なっているため、この場合、バイアスされ、ロックを使用すべきではないそうでない場合は無駄になる、注意を払うする必要それは、障害発生後にロックする傾向があり、すぐにヘビー級のロックが、軽量ロックへの最初のアップグレードを展開しません。

2、軽量ロック

ロックする傾向があるが失敗した場合、仮想マシンがすぐにヘビー級のロックにアップグレードしません、それは(1.6を追加した後)軽量ロックと呼ばれるツールの使用を最適化しようとします。前提が所定の位置に軽量ヘビー級ロックをロックしない場合、軽量ロックの使用するので、それは、生産の伝統的なヘビー級ロックミューテックスのパフォーマンスオーバーヘッドオペレーティングシステムの使用を削減するために、マルチスレッド競合の意図ではないではありませんあなたはミューテックスを適用する必要があります。また、軽量ロックのロックおよびロック解除CAS操作を使用しています。ロックとは、軽量の原則にロックが見ることができるアンロック「に深いJava仮想マシンの理解:JVMは機能やベストプラクティス、先進」第二版、第13章節ロックの最適化を。

同期性能はプログラムで向上させることができ、軽量ロックに基づいて実証的なデータである「ロックの大半については、全体の同期サイクル、には競争がないです」。何の競争が存在しない場合、軽量ロックは、ミューテックスの操作を使用してのオーバーヘッドなしCAS操作を使用して。ロックの競合がある場合でも、コストのミューテックスに加えて、それはまた、追加のCASは、ケースにはロック競合、軽量ロックが遅く、伝統的なヘビー級のロックよりもあり、起こる動作します!ロックは非常に競争力があるならば、それはすぐに軽量ヘビー級ロックを展開されます!

3、および適応スピンロックスピン

軽量ロックが失敗した後、オペレーティング・システム・レベルでの実際のスレッドがハングするだけでなく、スピンロックとして知られている最適化するための手段を回避するために、仮想マシン。

ミューテックス同期は(時間がかかり、カーネルモードへの変換ユーザーモード)を終了し、カーネルモードに通す必要がありますので、ハングスレッド/リカバリ操作のパフォーマンスに最大の影響を達成ブロックされています。

いいえ一般的なスレッドはので、このスレッドは、スレッドをサスペンド/レジュームするためのほんの少しの時間はろうそくの価値がある、長すぎるロック時間を保持していません。そのため、仮想マシンの開発チームは、これを検討する:「私たちはロックスレッドが、それはすぐにロックを解除しますロックを保持しているスレッドせずに中断されるかどうかを確認するために、しばらくお待ち取得要求の後ろに取得することはできますか?」 。スレッドを待機させるために、私たちは、スレッドがビジーループ(スピン)を実行し、技術はスピンと呼ばれてみましょう。

図4に示すように、ロックを除去します

ロックは、それは非常に単純であることを理解なくすことが共有データはロックの実装の排除、その後、太刀打ちできないことを検出した場合、それは、実行時にも、コンパイラ場合は、仮想マシンを指します。ロックは無意味な要求がロック解消の時間を節約することができます。

5、锁粗化

原則として、我々は、コードの作成には常に可能な限り小さくシンクブロックの範囲を限定することをお勧めします - ちょうどそうにするために同期させるために必要な演算の回数が可能となり、ストレート共有データ同期の実際の範囲にあることロックの競合がある場合、小さなは、待機中のスレッドができるだけ早くロックを得ることができること。

ほとんどの場合、上記の原則は問題ありませんが、連続した一連の操作は、同じオブジェクトのロックとロック解除を繰り返している場合は、それが不要なパフォーマンスのオーバーヘッドの多くをもたらすでしょう。

同期の違いとReentrantLockの程度の話

図1に示すように、両方のロックリエントラント

どちらも、リエントラントロックされています。「リエントラントロック」概念がある:彼らは再び自分自身の内部ロックを取得することができます。たとえば、スレッドがオブジェクトのロックを取得し、そのオブジェクトのロックが解除されていない、それは再びあなたがこのオブジェクトのロックを取得したいときはまだないリエントラントロックならば、それはデッドロックを引き起こす、中に取得することができます。ロックカウンタがインクリメントされているのと同じスレッドがロックを取得するたびに、そのロックカウンタは、ロックを解除するためにゼロに低下するまで待たなければなりません。

同期2は、JVMは、API ReentrantLockのに依存しているに依存します

3、ReentrantLockのは、いくつかの高度な機能を追加します:①待機を中断することができます。②公正なロックを達成することができます。③選択通知を達成することができます(ロックは、複数の条件をバインドすることができます)

ReentrantLockのロックを待っているスレッドを中断することができるメカニズムを提供する、この機構は、()lock.lockInterruptiblyによって実現されます。スレッドが待っている、変更され、他のものをあきらめることを選択することができます待っています。

ReentrantLockのは、公正または不当なロックロックするかどうかを指定することができます。唯一の非同期フェアロック。いわゆるフェアロックは、最初のスレッドがロックを取得するために待っているです。ReentrantLockのデフォルト以外のフェアでは、コンストラクタが公正であるかどうかをReentrantLockのReentrantLockのクラス(ブールフェア)によって開発することができます。

JDK1.6は、同期とReentrantLockの性能は基本的に同じであり、後に図4に示すように、性能は、選択基準はありません

  1. volatileキーワード

揮発性の特性

可変のスレッド修正値であり、この変数操作、異なるスレッドが、他のスレッドにこの新しい値が直ちに表示されているときの視認性を確保します。(視認性を実現)

禁止命令の並べ替え。(秩序の実現)

唯一の単一の読み取り/書き込みの原子性を保証することができ、揮発性。私は++ようなアトミック動作は保証されません。

synchronizedキーワードと揮発性のキーワード間の違いについての話

volatileキーワード軽量スレッドの同期は、揮発性、性能が良くsynchronizedキーワードよりも確かにある、達成されます。しかし、揮発性のキーワードは、変数のみに使用することができ、メソッドsynchronizedキーワードやコードブロックを変更することができます。synchronizedキーワードは、オーバーヘッドバイアスされ、ロック・軽量ロックとJavaSE1.6後に、他の様々な最適化によって導入された性能を持ってロックを取得するために削減し、解放するために主に行われた後、効率が大幅に、実際の開発に改善されましたキーワード同期シーン以上を使用します。

volatileキーワードブロッキングへのマルチスレッドアクセスは発生しませんし、ブロックすることが起こるのキーワード同期

volatileキーワードデータの可視性を確保するが、データの原子性を保証することはできません。どちらのsynchronizedキーワードを保証することができます。

揮発性のキーワードは、主に複数のスレッド間で変数の可視性を解決するために使用され、そして同期キーワードは、アクセスの同期に複数のスレッド間でリソースを解決しています。

  1. ThreadLocalの

通常の状況下で、我々は変数がアクセスするいずれかのスレッドもして変更することができます作成​​しています。あなたは、各スレッドが独自の専用のローカル変数を持って実装する場合はどのようにそれを解決するには?JDKは、この問題を解決するために、ThreadLocalのクラスを提供します。ThreadLocalのクラスの主要ソリューションは、各スレッドは、ボックスには、スレッドごとにプライベートなデータを格納することができ、その値は、データを格納することができボックスのメタファーのThreadLocalのクラス画像をバインドできるようにすることです。

ThreadLocalMapがあるのThreadLocal階、彼はカスタマイズされたHashMapにThreadLocalクラスの実装として理解することができ、最終的なデータはThreadLocalの上に存在しないThreadLocalMap存在しています。ThreadLocalMap ThreadLocalのは、パッケージとして理解することができます。

スレッドThreadLocalMapが設けられており、鍵ペアとしてのThreadLocal ThreadLocalMapに格納されてもよいです。

ThreadLocalのメモリリーク

キーThreadLocalMap ThreadLocalの弱参照として使用され、基準値が強いです。場合は、外部参照、ガベージコレクションのThreadLocal強いではないのであれば、鍵が一掃され、値が一掃されることはありません。その結果、ThreadLocalMapキーがnullのエントリに表示されますです。私たちはどんな対策をしない場合、その値は、GCの回復になることはありません、この時間は、メモリリークが発生することがあります。ThreadLocalMap実装はセット()、取得()、remove()メソッドを呼び出すとき、それはヌルレコードの鍵を一掃し、このような場合に考えられてきました。ThreadLocalの削除を使用してメソッドを呼び出した後()メソッドは、好ましくは、手動で

9.スレッドプール

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

誰もが当たり前となっている、スレッド・プール、データベース接続プールは、http接続プールに比べて技術をプーリングので、このアイデアのアプリケーションです。技術をプーリングの主なアイデアは、資源の利用率を向上させ、リソースへの各アクセスの消費量を削減することです。

前述の「Java並行プログラミングの芸術」のためのスレッドプールの使用についてのメリットを借りて:

リソース消費を削減します。スレッドを再利用することにより、消費に起因するスレッドの作成と破壊を軽減するために作成されています。

応答速度を向上させます。ミッションが到着すると、タスクは、スレッドの作成を直ちに実施することが可能になるまで待つ必要がないかもしれません。

管理性を向上させるスレッド。無制限の作成、システムリソースを消費するだけでなく、スレッドプールを使用して、システムの安定性を減らすだけでなく、配布、チューニングや監視を統一することができた場合、スレッドは、希少資源です。

区別と呼び出し可能インターフェースを達成するために、Runnableインタフェース

、Runnableインタフェースは、結果を返すか、チェック例外を投げるのではなく、呼び出し可能インターフェースすることができます。タスクの結果を返すか、例外をスローする必要はありませんが、Runnableインタフェースをお勧めしますのであれば、このようなコードのルックスがより簡潔になります。

あなたはRunnableを、呼び出し可能エグゼキューツールを使用して、オブジェクト間の変換を達成することができます。

違いは、メソッドがある)((実行)と提出は何を実行していますか?

()を実行します。戻り値を必要としないジョブを送信するために使用され、タスクが正常かどうかスレッドプールで実行されているかどうかを決定することは不可能です

()送信:タスクを送信するために使用される戻り値を必要とする、スレッドプールは、タスクが正常に実行されたかどうかを判定することができる将来のオブジェクトによって、型将来のオブジェクトを返します。

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

「アリ・ババのJava開発マニュアル」スレッドプールを強制するためには、エグゼキュータが作成を許可されていないが、ThreadPoolExecutorの方法により、このアプローチは、学生が、より明示的な運用ルールのスレッドプールを書くために、リソースの枯渇の危険性を回避することができます

次のように執行は、スレッド・プール・オブジェクトの欠点に戻ります。

FixedThreadPoolとSingleThreadExecutorは:要求がキュー長Integer.MAX_VALUEで許可され、それによってOOMを引き起こす、多数の要求を蓄積してもよいです。

CachedThreadPoolとScheduledThreadPool:あなたは、Integer.MAX_VALUEでのスレッドの数を作成するためにOOMをその結果、多数のスレッドを作成することができます。

ウェイ:コンストラクタによって実装

第二の方法:フレームエグゼキュータキュータによって実装ツール

私たちは、ThreadPoolExecutorの3種類を作成することができます。

FixedThreadPool:このメソッドは、スレッドプール内のスレッドの固定数を返します。スレッドプール内のスレッドの数は常に同じです。新しいタスクの提出があった場合、スレッドプールアイドルスレッドであれば、すぐに実行されます。、新しいタスクが一時的にタスクキューに格納されていない場合は、タスクキューにタスクを処理し、スレッドがアイドル状態にあります。

SingleThreadExecutor:メソッドは、スレッドプールのスレッドを1つだけ返します。複数のタスクは、スレッドプールに提出する場合は、スレッドがアイドル状態になるまで、タスクは、先入れ先出し順序のタスクキューを実行するために、タスクキューに保存されます。

CachedThreadPool:このメソッドは、スレッドの数を返し、実際のスレッドプールに応じて調整することができます。スレッドプール内のスレッドの数は不明であるが、アイドル状態のスレッドは、スレッドの優先順位の再利用可能なを使用する場合は、再利用することができます。すべてのスレッドが働いている場合は、別の新しいタスクの提出は、新しいスレッド処理タスクが作成されます。現在のタスクのすべてのスレッドが終了すると、それは、スレッドプールのマルチプレックスに戻ります。

最後に、私の全体の内容は、PDFドキュメントに照合、前方+プライベートの手紙の後の自由なアクセスの注意を引くためにしてください:覚えて面接はトリプルハ〜を受け取ることになっています!

公開された78元の記事 ウォンの賞賛9 ビュー6193

おすすめ

転載: blog.csdn.net/WANXT1024/article/details/104384503