ビッグデータのよくある面接問題のJavaマルチスレッド


文書ディレクトリ
  • 1.プロセスとスレッドの違い
  • 二.スレッドの作成方法
  • 三.スレッド状態
  • 四.同期方法と同期コードブロックの違い
  • 五.synchronizeとlock
  • について話します
  • 6.スレッドプールとは何ですか?Javaはどのスレッドプールを持っていますか?
  • 1.new CachedThreadPool
  • 2.new FixedThreadPool
  • 3.new SingleThreadPool
  • 4.new ScheduleThreadPool

  • 一.プロセスとスレッドの違い
  • プロセス:プロセスは実行中のアプリケーションであり、1つのプロセスには複数のスレッド
  • があります.
  • スレッド:プロセス内部の実行シーケンスであり、軽量レベルプロセス
  • とも呼ばれる.
    二.スレッドの作成方法
  • 1.Threadクラス
  • を継承する
  • 2.Runnableインタフェース
  • を実装する
  • 3.Callableインタフェース
  • を実現する.
  • 4.アプリケーションはExecutorフレームワークを使用してスレッドプールを作成してRunnableインタフェースを実現する方法がより人気があります.Threadクラスを継承する必要はありません.アプリケーション設計で他のオブジェクトを継承した場合、これはマルチ継承(Javaではサポートされていません)が必要です.インタフェーススレッドプールの使用も多く、非常に効率的で、
  • を実現し、使用しやすいです.
    三.スレッド状態
  • 準備状態(Runnable):スレッド準備運転は、必ずしもすぐに
  • を実行できるとは限らない.
  • 実行中(Running):プロセスはスレッドコード
  • を実行している.
  • 待機中(Waiting):スレッドがブロックされた状態で、外部の処理終了を待つ
  • スリープ中(Sleeping):スレッドが強制スリープ
  • I/Oブロック(Blocked On I/O):I/O操作完了待ち
  • 同期ブロック(Blocked On Synchronization):取得待ちロック
  • 死亡(Dead):スレッドは
  • の実行を完了しました.
    四.同期方法と同期コードブロックの違い
    Java言語では、各オブジェクトにロックがあります.スレッドはsynchronizeのキーワードを使用してオブジェクトのロックを取得できます.synchronizeのキーワードは、メソッドレベル(粗粒度ロック)またはコードブロックレベル(細粒度ロック)に適用できます.
    五.synchronizeとlockについてsynchronizeはJavaのキーワードで、彼が1つの方法または1つのコードブロックを修飾するために使用したとき、同じ時点で最大1つのスレッドだけがこのセグメントコードを実行することを保証することができる.JDK 1.5以降、スピンロックが導入され、ロックが粗くなり、軽量級ロック、偏向ロックが導入された.キーワードの性能を最適化するロックはインタフェースであり、synchronizeはキーワードであり、synchronizeは内蔵言語で実現され、synchronizeは異常が発生すると、スレッドが占有するロックを自動的に解放するため、デッドロック現象は発生しない.ロックは異常が発生した場合、unLock法でロックを解除しなければデッドロック現象を引き起こす可能性が高いため、ロックを使用する場合はfinallyコードブロックでロックを解除する必要があり、ロックはロックを待つスレッドの応答を中断させることができ、synchronizeはだめで、synchronizeを使用して待つスレッドはずっと待っていて、中断に応答できない.ロックでロックが成功したかどうかを知ることができますが、synchronizeではできません.
    六.スレッドプールとは何ですか.Javaはどのスレッドプールを持っていますか?
    オブジェクト向けプログラミングでは、オブジェクトを作成および破棄するのに時間がかかります.オブジェクトを作成するたびにメモリリソースまたはその他のリソースを取得する必要があるためです.Javaでは、仮想マシンがオブジェクトを追跡して、オブジェクトを破棄した後にゴミを回収できるようにしようとします.そのため、サービス・プログラムの効率を向上させる手段の一つは、オブジェクトの作成および破棄回数をできるだけ減らすことです.特に、リソースを消費するオブジェクトの作成と破棄は、" "テクノロジーによって発生します.スレッドプールは、その名の通り、実行可能なスレッドをいくつか事前に作成して1つのプール(コンテナ)に入れ、必要に応じてプールからスレッドを取得して自分で作成する必要がなく、スレッドを破棄する必要がなくプールに戻すことで、スレッドオブジェクトの作成と破棄のオーバーヘッドを削減します.
    1.new CachedThreadPool
    キャッシュ可能スレッドプールを作成します.スレッドプールの長さが処理の必要以上であれば、空きスレッドを柔軟に回収できます.回収可能でなければ、新規スレッド作業スレッドの作成数はほとんど制限されません(最大数はInteger.MAX_VALUE).これにより、スレッドプールにスレッドを柔軟に追加できます.スレッドプールにタスクを長時間コミットしていない場合、つまり、作業が指定された時間空いている場合(デフォルトは1分)すると、ワークスレッドは自動的に終了します.終了後、また新しいタスクをコミットすると、スレッドプールに新しいワークスレッドが作成されます.CachedThreadPoolを使用する場合は、タスクの数を制御することに注意してください.そうしないと、大量のスレッドが同時に実行されるため、システムがマヒする可能性があります.
    2.new FixedThreadPool
    指定されたスレッド数のスレッドプールを作成し、1つのタスクをコミットするたびにワークスレッドを作成します.スレッドプールの初期の最大数に達すると、コミットされたタスクをプールキューに格納します.FixedThreadPoolは、プログラム効率の向上とスレッドの作成にかかるコストの削減の利点を持つ典型的で優れたスレッドプールです.アイドル時、すなわちスレッドプールに実行可能なタスクがない場合、作業スレッドは解放されず、システムリソースも占有されます.
    3.new SingleThreadPool
    単一スレッド化されたExecutorを作成します.つまり、一意のワークスレッドのみを作成してタスクを実行します.彼は一意のワークスレッドのみでタスクを実行し、すべてのタスクが指定された順序(FIFO、LIFO、優先度)に従うことを保証します.実行.このスレッドが異常に終了すると、他のスレッドに取って代わって、順序の実行を保証する.単一作業スレッドの最大の特徴は、各タスクを順序的に実行することを保証し、任意の所定の時間に複数のスレッドがアクティブでないことである.
    4.new ScheduleThreadPool
    スレッドプールを作成し、タイミングおよび周期的なタスク実行をサポートし、タイミングおよび周期的なタスク実行をサポートし、3秒遅延で実行します.