1.なぜ、スレッドプールを使用します
スレッドオブジェクトを再利用するために、頻繁に作成および破棄スレッドを避けてください。また、スレッドプールを使用することも柔軟同時プロジェクトの数に応じて制御することができます。
スレッドダンプファイルを取得する方法2.java
無限ループ、デッドロック、ブロッキング、ページには、スレッドダンプは、問題を解決するための最良の方法です遊んで、スローやその他の問題を開きます。スレッドスタックを取得するために、スレッドダンプスレッドスタックと呼ばれていることの2つのステップがあります。
グレップJavaの| 1)PIDスレッドを取得するには、jpsコマンドは、Linux環境のps -efでも使用することができます使用することができます
2)印刷スレッドスタック、あなたはまた、キル-3 PIDを使用することができ、Linux環境でjstack pidのコマンドを使用することができます
Threadクラスは、getStackTraceメソッド()メソッドを提供し、さらに言及はまた、スレッドのスタックを得るために使用され得ます。これは、インスタンスメソッドであるため、この方法は、特異的かつ結合糸のインスタンスである、すべての取得は、現在のスレッドのスタックを実行特定を得ることです。
スレッドがオブジェクトのモニターを保持するかどうかを検出する方法3。
Threadクラスは、モニターがオブジェクトobjである場合にのみ、holdsLock(オブジェクトobj)メソッドを提供しています。私たちは、スレッドがオブジェクトのモニターを保持しているかどうかを判断する方法があります知っている前に、複数のねじ面の質問を見るために並んでいました戻り時間のスレッドは、これは「特定のスレッドは、」現在のスレッドを指すことを意味する静的メソッドであること、当てはまるであろう。
違い4.synchronizedとReentrantLockの
、ReentrantLockの2つの間に本質的な違いであるクラス、同じキーワードである一方、それは、のために、他に、同期している場合です。ReentrantLockのクラスがあるので、それは、あなたが、あなたはクラス変数、ポイントに反映さよりもスケーラビリティ同期ReentrantLockの様々な構造を有することができることができる方法がある同期の特性を継承することができますより多くの柔軟性を提供します。
(1)ReentrantLockのは、このようなデッドロックを回避し、ロックを取得するための待機時間を設定することができ
(2)ReentrantLockのは、様々な情報のロックを取得してもよいです
マルチチャネル通知を達成するために(3)ReentrantLockの柔軟性
また、ロック機構の両方が、実際には同じではありません。ReentrantLockの低レベルの呼び出しは、ロックの公園安全でない方法は、同期動作は、私は判断できない対象ヘッダマーク語、でなければならないこと。
並行処理の度合いはどのようなものです5.ConcurrentHashMap
ConcurrentHashMapの同時実行がセグメントのサイズで、デフォルトは同時にハッシュテーブルのConcurrentHashMapの最大の利点であるのConcurrentHashMapを、動作する16件のスレッドにそこまでできることを、どのような場合には、2件のスレッドがあります同時にハッシュテーブルは、ハッシュテーブルを得ることができた手段、16ですデータ?
6.ReentrantLockは何ですか
ReentrantLockのが悪いと言ってないで、まず明確に見て、ちょうどReentrantLockのは時々制限があります。あなたがReentrantLockのを使用している場合は、それ自体がスレッドAの書き込みデータを防ぐためであってもよく、リードしたデータのデータの不整合スレッドBが発生するが、データを読み、読み出したデータは、データは変更されませんこの方法では、データの読み取り内のスレッドのC場合、スレッドDも、それは必要ありませんロック、それでもプログラムのパフォーマンスが低下し、ロックアップ。
このため、読み書きロックReadWriteLockの誕生前に。ReadWriteLockインタフェースは、読み取りと書き込み、読み出しおよび書き込みの分離を実現することになり、リードロックが共有され、排他的書き込みロックは、相互に排他的な書き込み及び読み出しはない、ReadWriteLockインタフェースを備えた特定の実装ReentrantReadWriteLockある、読み書きロックであります書き込みおよび読み取り、書き込み、および書き込みの間で相互に排他的で、読み取りと書き込みのパフォーマンスが向上します。
7.FutureTaskは何ですか
この事実は、先に述べた、FutureTaskはという非同期操作のタスクを示します。タスク非同期処理の結果にアクセスするために待機させることができる、完成された呼び出し可能な実装クラスを渡すことができFutureTaskは、操作タスクをキャンセルするか否かが判断されます。もちろん、FutureTaskまた、Runnableインタフェースの実装クラスので、FutureTaskので、スレッドプールに配置することができます。
8.Linux環境下ではCPU最長を使用するスレッド見つける方法
これは、私はかなり無意味に感じることを部分的現実的な問題です。あなたは行うことができます。
PID(1)買収プロジェクト、JPSまたはPS -ef | grepをjavaのは、前にこのことについて話をしています
(2)トップ-H -p PID、順序を変更することはできません
あなたは、現在のプロジェクト、CPU時間の各スレッドの占有率をプリントアウトすることができるように。注この劇は、オペレーティングシステムのネイティブスレッドのスレッドであるLWPを、あること、そして私のノートヒルは、Linux環境下でJavaプロジェクトを展開していなかったので、デモをキャプチャする方法はありません、同社は、Linux環境で展開プロジェクトを使用している場合、ユーザーと友人は、あなたが試すことができます。
使用「トップ-H -p PID」+通常ので、無限ループ内のコードの結果の不適切な操作の高いCPUの理由を、占め、あなたは簡単に高いCPUスレッドスレッドスタックとバーを見つけることができる「JPSは、PID」、それによって位置決め。
最後にそれを言及し、「トップは-H -p PID」LWPから抜け出すには、それを変換、あなたはCPU-高いスレッドに進ナビゲートすることができますされているローカルスレッド番号から抜け出す「JPSはのpid」、10進数です現在のスレッドが積み重なります。
スレッドの出現に例外が実行されている場合はどうなります9。
例外がキャッチされていない場合は、スレッドが実行を停止します。もう一つ重要な点はこれです:このスレッドがオブジェクトのモニターを保持している場合は、そのオブジェクトのモニターが即座に解放されます
二つのスレッド間でデータを共有する方法10
通知/待機し、それにスレッド間でオブジェクトを共有することにより、および/のnotifyAll、のawait /信号/喚起し、待機、BlockingQueueのブロックキューデータは、スレッドとデザインの間で共有されていると言うことsignalAll
11スレッドとプロセスの違いは?
次の処理に少なくとも一つのプログラムは、プロセスの下で、プロセス、少なくとも1つのスレッドは、プログラムの実行速度を高めるために複数のスレッドを持つことができ、があります。
12.スレッドの保護者は何をしているのですか?
デーモンスレッドは、バックグラウンドでの特別なプロセスを実行しています。これは、制御端子とは無関係であり、定期的にいくつかのタスクまたは処理を待ついくつかのイベントを実行します。Javaのガベージコレクションのスレッドでは、特殊なスレッドガードです。
13.スレッドを作成するさまざまな方法は何ですか?
スレッドを作成するための3つの方法があります。
スレッドの継承されたメソッドを再実行します。
Runnableを実装します。
呼び出し可能インターフェースを実装します。
セイ何かを実行可能と呼び出し可能な14の違いは何ですか?
戻り値をRUNNABLEない、戻り値を取得することができます呼び出し可能、呼び出し可能は、補実行可能として見ることができます。
15.スレッドの状態は何ですか?
スレッドの状態:
NEWはまだ開始されていません
RUNNABLEは実装されています
BLOCKEDブロックされた(同期ロックまたはロックIOをブロックします)
永久待ち状態を待ち
再目覚めた状態に指定された時間を待ってTIMED_WAITING
TERMINATED実行が完了しています
16.睡眠()と待機()の違いは何ですか?
オブジェクトからのスレッド、待機()からスリープ():異なるクラス。
ロックを解除しない()睡眠; wait()を、ロックを解除する:ロックを解除してください。
自動的に回復するためにスリープ()時間; wait()を通知する()/のnotifyAll()直接のきっかけを使用することができます異なるを使用してください。
17.通知()とのnotifyAll()の違いは何ですか?
()のnotifyAll後にスレッドを覚ます)(通知、すべてのスレッドをウェイクアップします。首尾よく再び競争するためにリリースされるロックのためのロック待ちの後にプールに滞在し、失敗した場合、進んで競合する、のnotifyAll()呼び出しの後、すべてのスレッドは、ロックプールのプール待ちでロックを移動され、その後、競争に参加します。そして、)(通知のみスレッド、特定の仮想マシン・ウェイクによって制御されているスレッドをウェイクアップします。
18.スレッドのrun()、スタート()の違いは何ですか?
とき、コードの実行スレッドを動作させるためのスレッド、run()メソッドを起動する()メソッドを起動します。実行())(繰り返し呼び出され、開始することができ、一度だけ呼び出すことができます。
19.いくつかの方法がありますスレッドプールを作成しますか?
スレッドプールを作成するための7つの方法がありますが、コアが最後です。
newSingleThreadExecutor():それはすべてのタスクが順番に実行されていることを保証しますので、それがアクティブで、許可していないタスクにそこまでだろう、***ワーク・キューを操作し、1に制限されているワーカースレッドの数によって特徴付けられますスレッドの数を回避することができる変化ユーザスレッドプールの変化の例。
newCachedThreadPool():短期的な多数のタスクを処理するためのスレッドプールでいくつかの特徴的な機能を備えています。それは何のスレッドが利用できない場合、それは新しいワーカースレッドを作成し、キャッシュと再利用のスレッドにキャッシュを試みます。場合60秒以上のアイドル時間をスレッド、それが終了すると、キャッシュから削除された、長い時間アイドル、このスレッドプールは、すべてのリソースを消費しません。SynchronousQueueは内部作業キューとして使用します。
newFixedThreadPool(int型にnthreads):再使用は、ワーカースレッドがアクティブにnthreadsまでの任意の時間までに***作業キューを使用して後ろの番号(nthreadsの値)スレッドを指定しました。この手段タスクの数は、作業キューに表示される空きスレッドを待って、アクティブキューの数を超えた場合に、ワーカースレッド出口がある場合は、指定された番号にnthreadsを補うために作成された新しいワーカースレッドがあるでしょう。
newSingleThreadScheduledExecutor():シングルスレッドのプールを作成し、ScheduledExecutorServiceリターン、または定期的タイミングがスケジュールに動作することができます。
newScheduledThreadPool(INT corePoolSize)とnewSingleThreadScheduledExecutor()同様に、作成されたScheduledExecutorService、タイミング又はすることができる定期的なスケジューリング作業、以外は単一または作業ワーカースレッドの複数;
newWorkStealingPool(int型並列処理):これは、多くの場合、これは内部ForkJoinPool、ワークスチール・アルゴリズム、並列処理タスクの使用を構築する方法を作成するために追加する前に、スレッド・プール、Javaの8を見過ごされている、処理シーケンスを保証するものではありません。
ThreadPoolExecutorは():スレッドプールの中で最も原始的で作成され、ThreadPoolExecutorのためにパッケージ化されている方法を作成するには、上記の手順。
20.スレッドプールのステータスは何ですか?
RUNNING:これは、タスクの待ちキューの処理、新しいタスクを受け入れるために、ほとんどの正常な状態です。
SHUTDOWN:新しいタスクの提出は受け付けませんが、タスクキューを待って対処していきます。
STOP:新しいタスクの提出を受け入れない、もはや待っていない、割り込みスレッドがタスクを実行しているタスクキューを処理します。
片付け:片付け状態に変換するとき、すべてのタスクが破壊され、workCountは0、スレッドプールの状態であり、()終了フック方法を実行します。
TERMINATED:終了()メソッドの後、状態は、スレッドプールになります。
21.スレッドプールを提出()およびexecute()メソッドの違いは何ですか?
()を実行:タスクのRunnableをタイプにのみ実行することができます。
提出():タスクのRunnableを、呼び出し可能なタイプを実行することができます。
タスクの呼び出し可能なタイプは、戻り値を取得するために実行、およびのRunnableには戻り値を実行することはできません。
22. Javaプログラムはどのようにマルチスレッドの安全な動作を確保するには?
方法の一つ:同時下層階級utilのJavaなどの使用の安全性のクラス、...
オプション2:自動ロック同期。
方法3:手動ロックロックを使用してください。
手動ロックの典型的なJavaコードは次のとおりです。
ロックロック=新しいReentrantLockの();
ロック。ロック();
{試します
..システムのprintln( "GETロック")アウト。
}キャッチ(例外e){
// TODO:ハンドル例外
} 最後に {
...のprintln(「ロック解除」)アウトシステム。
ロック。ロック解除()。
}
23.同期マルチスレッドロックのエスカレーションの原理はどのようなものですか?
ロックのエスカレーション原理を同期:ロックオブジェクトの頭の中のオブジェクトは、フィールドが空、JVMそのスレッドIDに偏っロックおよびスレッドIDのセットを保持するために許可されているスレッドIDの最初の訪問では、そこにスレッドIDで、それがいつ再入力最初にそれが正常でない場合は、そのスレッドIDとスレッドID一貫したは、一貫性のある場合は、あなたが直接このオブジェクトを使用し、そうでない場合することができ、その後、アップグレード偏ったロックは、一定回数の後に、所定の回数のスピンサイクルを介して取得するためのロック、軽量ロックであるかどうかを判断それはヘビー級に軽量からロックロックをアップグレードされます、あなたが使用したいオブジェクトを取得するには、このプロセスは、同期ロックのアップグレードを構成しています。
アップグレードロックの目的:ロック・エスカレーションは、パフォーマンス上のオーバーヘッドを最小限に抑えるために秩序をもたらすにロックです。同期ので、消費をもたらしたロック性能が低下する、ロックロック方式をアップグレードし、その後ヘビー級とまで軽量にアップグレードバイアスされ、ロックを使用するJava 6の実装の最適化の後。
24.デッドロックとは何ですか?
場合ホールド排他ロックスレッドAおよびスレッドBが排他ロックBを保持し、の排他ロックを取得しようとし、AB 2つのスレッドがお互いを保持する必要性に起因し発生した場合の排他ロックBを取得しようとする試みの両方閉塞を発生し、我々はデッドロックと呼ばれるロック、。
25.どのようにデッドロックを防ぐために?
tryLock(長いタイムアウト、TimeUnitで単位)タイムアウトを設定する方法(ReentrantLockの、ReentrantReadWriteLock)、使用することを確認し、タイムアウトがデッドロックを防ぐ終了することができます。
Javaのを使用してみてください。Utilの。代わりに、独自の手書きロックの同時並行クラス。
ロックの粒度の使用を最小限に抑え、同じロックいくつかの機能を使用しないようにしてください。
同期コードブロックを最小限に抑えます。
26. ThreadLocalのそれとは何ですか?**使用シナリオは何ですか?**
各スレッドが独立してコピーを対応する他のスレッドに影響を与えることなく、そのコピーを変更することができますので、変数の各使用のためのThreadLocalのスレッドは、独立変数のコピーを提供します。
ThreadLocalのは、古典的なシナリオでは、データベース接続とセッション管理で使用します。
27話はおよそ基本原理を達成するために、同期?
monitorenter / monitorexit命令の組によって達成される同期、モニタオブジェクトは、基本的にはユニットを同期化されます。Java 6の前に、それが原因でユーザーモードカーネルモードを切り替える必要のため、内部のモニターオペレーティングシステムのミューテックスに完全に実装され、同期動作は未分化のヘビー級操作は、パフォーマンスが非常に低いです。Java 6のは、Javaは仮想マシンが行われたときしかし、大幅によく言われる三つの異なるモニターの実装を提供する、改善された、3つの異なるロック:ロックバイアス(偏りロック)、ロック・軽量大幅に性能を向上ヘビーロック、。
違い28が同期してその揮発性とは何ですか?
揮発性改質剤は、可変であり、同期が変更されたクラス、メソッド、コードセグメントです。
可視性とアトミック変数を確保することができ、同期や修正、揮発性の可視性は、唯一の修正変数を達成することができアトミック性を保証するものではありません。
揮発性は、閉塞スレッドを引き起こすことはありません。閉塞スレッドを引き起こす可能性が同期。
29.同期とロックは何が違いますか?
これは、ブロックをロックする、クラス、メソッドに同期させることができ、ロックは、ブロックをロックします。
、使いやすい、手動で取得してリリースロックすることなく、同期の異常を自動的にロックを解除し、デッドロックは発生しません、とロックは独自のロックを必要とし、ロックを解除するためにUNLOCK()不適切ではない使用している場合、ロックを解除することは死をもたらすだろうロック。
ロックによってロックを取得するために、成功せずに知っている、それは行うことはできません同期することができます。
30.同期とReentrantLockの何が違いますか?
ReentrantLockのに比べて、比較的非効率的な同期化の早期実現には、ほとんどのシーンは全く異なる性能のですが、Java 6 DUIに多くの改善があったに同期させています。
次のように主な違いは次のとおりです。
ReentrantLockのは、より柔軟な使用していますが、アクションでロックを解除する必要があります。
ReentrantLockの手動で取得してロックを解除し、手動で解除し、ロックを開くことなく同期しなければなりません。
ReentrantLockのロックブロックのみコード、および修正方法は、同期コードのブロックなどのために使用することができます。
変数揮発性フラグは、コンパイラ最適化されないであろう。マークは、可変最適化コンパイラを同期させることができます。
アトミック原則について31話?
原子CAS(比較およびWWAP)、揮発性およびネイティブメソッドの主な用途は大きく、同期の高コストを回避する効率を向上するように、アトミック操作を確実にします。
呼び出し元のスレッド静的ブロックで32 Threadクラスのコンストラクタ、
これは非常にトリッキーかつトリッキーな質問です。注意:Threadクラスのコンストラクタ、静的ブロックはスレッドクラスは、新しいスレッドと呼ばれている、およびメソッド内のコードを実行するスレッド自体によって呼び出されています。
上記の文はあなたが混乱して感じさせるならば、私は、例えば、その後、新しいスレッド2という新しいスレッド2でスレッド1、主な機能を前提としています。
コンストラクタ1)スレッド2静的ブロックは、スレッド2メインスレッドの呼び出しであるrun()メソッドは、自身のスレッド2呼び出され
コンストラクタ2)スレッド1の静的ブロックはスレッド2、スレッド1と呼ばれ、run()メソッドは、そのスレッド1が起動されます
より良い選択であり、同期および同期ブロックの33 A法、
シンクブロック、さらに同期コードよりも全体的なプロセスの効率を高めるシンクブロック外部コードが非同期であることを意味します。できるだけ同期:その原理を知ってください。
この記事を通して、私はより良い同期の範囲が、少し余分を置くが、ロックが粗大化と呼ばれるJava仮想マシンの最適化の方法がまだ存在で、この方法は、範囲が増加を同期させることです。これは、たとえばStringBufferのために、それはスレッドセーフなクラスで、最も一般的な天然のappend()メソッドは同期方式有用である、我々は、コードがロックを繰り返されることを意味アペンド文字列を、繰り返される書き込み - >ロック解除この性能欠点は、Java仮想マシンコードを繰り返し追加するメソッド呼び出しがロックされているように、Java仮想マシンを繰り返し、このスレッドにカーネルモードとユーザモードとの間で切り替えることを意味するので複数頭尾appendメソッドを追加する操作、拡張操作を粗く、それはこのようにロックを低減、大シンクブロックになる - >ロック解除回、有効コード実行の効率を改善します。
34.高同時タスクの実行時間は、スレッドプールを使用する方法を短い管理者ですか?**同時実行スレッドプールを使用してどのくらいのタスク実行時間ビジネス、高くないですか?**高い同時実行、どのくらいの時間が業務執行のスレッドプールを使用してサービス?
これは私がオンライン並行プログラミングで見る問題であり、私が最後にこの質問を入れて、私は、これは、非常に専門的、非常に実用的な非常に良いですので、誰もが、見てについて考えることができると思います。この問題では、個人的な見解は以下のとおりです。
1)高い同時、ビジネスタスク実行時間の短い、スレッドプール内のスレッドの数がスレッドコンテキストスイッチングを減らすCPUコア+1の数に設定することができます
2)高い同時実行ではない、長い時間の事業領域に対して実行されるように別々のタスクを参照してください。
a)のビジネスは、長い時間が、操作は非常にすべてのCPUが引退してみましょうと座っていない、CPU IOを取らないので、あなたはCPUを聞かせて、プール内のスレッドの数を増やすことができ、IO集約型のタスクであるIO操作、に焦点を当てている場合より多くのビジネスを扱います
B)トラフィックが長時間運転に集中している場合は、計算集約的なタスクであり、算出さは、そのない溶液、及び(1)のように、プール内のスレッドの数が少なくなるように設定されている、スレッドコンテキストスイッチングを減らします
C)高い同時実行、長時間の業務執行は、このタイプのタスクを解決する鍵は、スレッドプールにではなく、全体的なアーキテクチャの設計では、彼らはデータキャッシュのいくつかの内部でビジネスを行うことができるかどうかを確認最初のステップであるために、第二には、サーバを増やすことですステップは、スレッドプールを設定すると、スレッドプールは、その他の関連記事への参照を設定します。最後に、長い時間の業務執行上の問題は、また、あなたが分割タスクとデカップリングにミドルウェアを使用することができるかどうか、それを分析する必要があるかもしれません。
エピローグ
、お互いを励まし、今お互いを奨励するために、これらの単語を取ります。より多くの仕事は、あなたが公式の第二世代、豊かな第二世代、第二世代の赤でない場合より多くの幸運は、覚えている:ハードワークはショートカットだけあなたの運命を変更することです。
一緒に改善し議論するコメント欄にあなたの意見を残して自由に感じます。今日の記事は、あなたに新しいインスピレーション、学習能力を高めるための新しい理解を与えた場合は、歓迎転送するために、より多くの人にシェアを。
参加するには読者へようこそプログラマを**知識ドック**テクノロジー・グループは、「公共の場で何背景返信プラスグループは」になることはできません。
![](データ:; <?xmlのバージョン= "1.0">画像/ SVG + XML UTF8、<SVGのxmlns =」http://www.w3.org/2000/svg "バージョン=" 1.1"幅= "620"高さ= "23"> </ SVG>)
あなたが見てみたいと思います
1.は常に何をするつもりされて最終的にインタビューJVMのチューニングを頼みますか?
2.プログラマは、どのようなキャリアプランニングの持っている必要がありますか?価値についての考え方!
3.毎日3分の技術ドライ|顔の質問+回答| JVMの記事()
4.毎日3分の技術ドライ|顔の質問+回答| JVMの記事(B)
5.毎日3分の技術ドライ|顔の質問+回答| Redisの記事()
6.毎日3分の技術ドライ|顔の質問+回答| MySQLの記事()
7.毎日3分の技術ドライ|顔の質問+回答| RabbitMQの記事()
9.毎日3分の技術ドライ|顔の質問+回答|春SpringMVCの記事()