[シリーズを知らなければならない]Javaスレッド面接あなたが知らなければならない基礎知識1

5184 ワード

  • Javaメモリ管理面接ガイド
  • Java基礎面接ガイド
  • Java基礎面接ガイド二
  • Java基礎面接ガイド三
  • Java基礎面接ガイド四
  • Javaスレッド面接ガイド
  • Javaスレッド面接ガイド二
  • Redis面接ガイド
  • Kafka面接ガイド
  • Spring面接ガイド
  • SpringBoot面接ガイド
  • マイクロサービス面接ガイド
  • Javaは、単一スレッドおよびマルチスレッド操作をサポートします.スレッドはプログラムの実行パスです.今日作成されたほとんどのプログラムは単一スレッドとして実行され、複数のイベントやアクションが同時に発生する必要がある場合に問題が発生します.単一スレッドプログラムには、エントリポイント(main()メソッド)と出口ポイントがあります.
    スレッドを作成するには、2つの異なるメカニズムを使用します.
    拡張Threadクラス
    Runnableインタフェースの実装
    Javaのスレッドは何ですか?
  • スレッドはCPUを最適に消費するので、マルチプロセッシングが可能である.マルチスレッド化によりCPUの空き時間が短縮され、アプリケーションのパフォーマンスが向上します.
  • スレッドは軽量レベルのプロセスです.
  • スレッドクラスはjava.langパッケージに属します.
  • スレッドを作成しなくても、Javaで複数のスレッドを作成できます.少なくとも1つのスレッド、すなわちプライマリ・スレッドが存在します.
  • 複数のスレッドがJavaで並列に実行されます.
  • スレッドには独自のスタックがあります.
  • スレッドの利点:スレッドが並列に実行できるため、1つのスレッドでいくつかのタスクを完了するのに10分かかると仮定します.

  • JavaのプロセスとThreadの違いは何ですか?
    1つのプロセスに複数のスレッドを作成できます.
    スレッドはプロセスのサブディビジョンです.1つ以上のスレッドがプロセスのコンテキストで実行されます.スレッドは、プロシージャの任意の部分を実行できます.プロセスの同じ部分は、複数のスレッドで実行できます.
    プロセスには親プロセスのデータ・セグメントのコピーがあり、スレッドはプロセスのデータ・セグメントに直接アクセスできます.
    プロセスには独自のアドレスがあり、スレッドはそれを作成するプロセスのアドレス空間を共有します.
    プロセスの作成には多くの作業が必要です.親プロセス全体をコピーする必要があるかもしれませんが、スレッドを簡単に作成できます.
    プロセスはサブプロセスと容易に通信できるが,プロセス間の通信は困難である.同時に、スレッドはwait()およびnotify()メソッドを使用して、同じプロセスの他のスレッドと簡単に通信することができる.
    処理中、すべてのスレッドはシステムリソース(スタックメモリなど)を共有し、スレッドは独自のスタックを有する.
    プロセスに対する変更はサブプロセスには影響しませんが、スレッドに対する変更はプロセスの他のスレッドの動作に影響を与える可能性があります.
    異なるプロセスと同じプロセスでスレッドを作成する場所の例を表示します.
    Javaでスレッドを実装する方法
    これは非常に基本的なスレッドの問題です.スレッドは、java.lang.Runnableインタフェースを実装するか、java.lang.Threadクラスを拡張してrunメソッドを拡張する2つの方法で作成できます.
    スレッドには独自の変数と方法があり、スタック上で生存し、死亡します.ただし、実行スレッドは、独自の呼び出しスタックを持つ単一のプロセスです.スレッドはJavaの軽量レベルのプロセスです.
    java.lang.Runnable interfaceを実装してスレッドを作成します.
    Runnableインタフェースを実装するクラスのオブジェクトを作成します.
    MyRunnable runnable=new MyRunnable();
    
    Thread thread=new Thread(runnable);
    

    次に、コンストラクション関数を呼び出し、Runnableインタフェースの参照(すなわちrunnable object)を渡すことによって、Threadオブジェクトを作成します.
    Thread thread=new Thread(runnable);
    

    スレッドは独自のスタックを実装しますか?もしそうであれば、どのように実装しますか?
    はい、スレッドには独自のスタックがあります.これは非常に興味深い問題で、面接官はスレッドがどのように内部的に自分のスタックを維持するかに関する基本的な知識をチェックする傾向があります.
    Runnableインタフェースまたは拡張Threadクラスを実装する必要があります.Runnableの実装と拡張Threadの違いは何ですか?
    良い答えは、run()や他の方法を変更する場合にのみ、Threadを拡張する必要があります.Runnableを実装するrun()メソッドのみを修正するのが最善の選択である(Runnableインタフェースには抽象メソッドであるrun()しかない).
    Runnableインタフェースの実装と拡張Threadクラスの違いは何ですか?
    JAvaでは多重継承は許可されていません:Runnableインタフェースを実装すると、別のクラスを拡張することもできますが、Threadクラスを拡張すると、Javaでは多重継承が許可されていないため、他のクラスを拡張することはできません.したがって、Runnableと拡張Threadを実装することで同じ作業を完了できますが、Runnableを実装する場合、他のクラスを拡張することもできます.したがって,Runnableを実現することが望ましい.
  • スレッドセキュリティ:Runnableインタフェースを実装すると、同じオブジェクトは複数のスレッド間で共有されますが、Threadクラスを拡張すると、各スレッドは新しいオブジェクトに関連付けられます.
  • 継承(Runnableを実装するのは軽量レベルの操作):Threadを拡張する必要がない場合、すべてのThreadクラスの機能は継承されますが、Runnableインタフェースを実装する場合、Runnableは抽象的な方法、すなわちrun()メソッドのみを含むため、追加の機能は継承されません.したがって,Runnableを実現することは軽量レベルの操作である.
  • はインタフェースに符号化されます.javaもインタフェースに符号化することをお勧めします.したがって、拡張スレッドではなくRunnableを実装する必要があります.また,ThreadクラスはRunnableインタフェースを実現する.
  • クラスの基本的な動作を変更しない限り、拡張しないでください.Runnableインタフェースには、run()と他のメソッドを変更する場合にのみ、Threadを拡張する抽象的なメソッドがあります.Runnableを実装するrun()メソッドのみを修正するのが最善の選択である(Runnableインタフェースには抽象メソッドであるrun()しかない).Threadクラスの基本的な動作を変更しない限り、Threadクラスを拡張することはできません.
  • Runnableを実装する際のコードの柔軟性:まずThreadを拡張すると、すべてのスレッド機能が継承され、私たちのクラスはThreadの直接サブクラスになるので、私たちがしているすべての操作はThreadクラスにあります.しかし、Runnableを実装すると、新しいスレッドを作成し、runnableオブジェクトをパラメータとして渡し、runableオブジェクトを実行プログラムServiceなどに渡すことができます.したがって,Runnableを実装すると,より多くの選択肢があり,コードがより柔軟になる.
  • Executor Services:Runnableを実装する場合は、実行可能オブジェクトに作成された複数のスレッドをExecutor Servicesを使用して開始できます(新しいスレッドを使用してRunnableオブジェクトを起動できるためです).ただし、Threadを拡張する場合は、スレッドが1回しか起動できないためです.

  • スレッドの動作は予測不可能ですか?
    問題の解決策は非常に簡単で、スレッドの動作は予測できない.スレッドの実行はスレッドスケジューラに依存し、スレッドスケジューラはWindows、Unixなどの異なるプラットフォームでの実現方式が異なる可能性があるからだ.同じプラットフォームでも、同じスレッドプログラムは後続の実行で異なる出力を生成する可能性があります.
    これを実現するために、同じRunnableオブジェクト上に2つのスレッドを作成し、run()メソッドでforループを作成し、2つのスレッドを開始します.どのスレッドが最初に完了するかは決定できません.両方のスレッドはforループで匿名で入力されます.
    スレッドがJavaの軽量レベルのプロセスでない場合?
    同じプロセスのスレッドが同時に実行される場合にのみ、スレッドは軽量レベルのプロセスです.ただし、異なるプロセスのスレッドが同時に実行される場合、スレッドはヘビー級プロセスです.
    mainから始まるすべてのスレッドが開始順に終了し、mainが最後に終了するようにするにはどうすればいいですか?
    面接官は面接者のThread方法に対する理解を理解する傾向がある.だから、今は正しい答えであなたの観点を証明しなければなりません.join()メソッドを使用して、mainから始まるすべてのスレッドがそれらの開始順に終了し、mainも最後に終了しなければならないことを確認することができます.すなわち、スレッドの死を待つ.内部呼び出しjoin()メソッドはjoin(0)を呼び出す.
    詳細:Join()メソッド–mainから始まるすべてのスレッドが開始順に終了し、mainも最後に終了する必要があることを確認します.プログラムのjoin()メソッドのタイプ−joinの10の顕著な特徴を有する.
    run()メソッドとstart()メソッドを使用してスレッドを起動する違いは何ですか?
    これは非常に興味深い問題であり、run()メソッドとstart()メソッドを使用してスレッドを起動する間に確かに違いがあると考える場合があります.
    start()メソッドを呼び出すと、プライマリスレッドは内部でrun()メソッドを呼び出して新しく作成したスレッドを起動するため、run()メソッドは最終的に新しく作成したスレッドに呼び出されます.
    新しいスレッドを使用してrun()メソッドを起動するのではなくrun()メソッドのプライマリスレッドを呼び出すと、run()メソッドが自動的に起動します.
    Volatileキーワードを使用して何の意味がありますか?
    Javaでは、スレッドが共有変数にアクセスできます.通常、共有変数が一貫して更新されることを保証するために、スレッドは、これらの共有変数に対して反発を強制するロックを取得することによって、このような変数が独自に使用されていることを保証しなければならない.
    フィールドを揮発性として宣言すると、Javaメモリモデルは、すべてのスレッドで表示される変数値が一致することを保証します.