[シリーズを知らなければならない]Javaスレッド面接あなたが知らなければならない基礎知識1
5184 ワード
スレッドを作成するには、2つの異なるメカニズムを使用します.
拡張Threadクラス
Runnableインタフェースの実装
Javaのスレッドは何ですか?
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を実現することが望ましい.
スレッドの動作は予測不可能ですか?
問題の解決策は非常に簡単で、スレッドの動作は予測できない.スレッドの実行はスレッドスケジューラに依存し、スレッドスケジューラは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メモリモデルは、すべてのスレッドで表示される変数値が一致することを保証します.