ホームページ  >  記事  >  Java  >  2020 年の新しい Java 面接の質問 - マルチスレッド (2)

2020 年の新しい Java 面接の質問 - マルチスレッド (2)

王林
王林転載
2020-05-07 16:57:582164ブラウズ

2020 年の新しい Java 面接の質問 - マルチスレッド (2)

1. スレッドの状態は何ですか?

スレッドには通常、作成、準備完了、実行中、ブロック、デッドの 5 つの状態があります。

1. 作成状態

スレッドオブジェクトが生成された時点では、オブジェクトの start メソッドは呼び出されず、スレッドは作成状態にあります。

2. 準備完了状態

スレッド オブジェクトの start メソッドが呼び出されると、スレッドは準備完了状態になりますが、この時点では、スレッド スケジューラはスレッドを現在のスレッドとして設定していません。 . これで準備完了の状態になりました。スレッドの実行後、待機またはスリープ状態から戻った後も準備完了状態になります。

3. 実行状態

スレッド スケジューラは、準備完了状態のスレッドを現在のスレッドとして設定し、この時点でスレッドは実行状態に入り、run 関数でコードの実行を開始します。 。

4. ブロッキング状態

スレッドは実行中に一時停止され、通常は実行を続行する前に一定時間待機します (たとえば、特定のリソースの準備が完了する)。スリープ、サスペンド、待機などのメソッドはスレッドのブロックを引き起こす可能性があります。

5. 停止状態

スレッドの run メソッドが終了するか stop メソッドが呼び出されると、スレッドは停止します。スレッドが停止した場合、start メソッドを使用してスレッドを準備することはできません。

(関連ビデオチュートリアルの推奨事項: java ビデオ )

2. sleep() と wait() の違いは何ですか?

1. sleep(): このメソッドはスレッド クラス (Thread) の静的メソッドであり、呼び出し元のスレッドがスリープ状態に入り、他のスレッドに実行の機会を与えます。が終了すると、スレッドは準備完了となり、他のスレッドと CPU 実行時間を競合します。 sleep() は静的メソッドであるため、オブジェクトのマシン ロックを変更できません。sleep() メソッドが同期ブロック内で呼び出されると、スレッドはスリープ状態になりますが、オブジェクトのマシン ロックは解放されず、他のスレッドは依然として変更できません。このオブジェクトにアクセスします。

2. wait(): wait() は Object クラスのメソッドです。スレッドが wait メソッドを実行すると、オブジェクトに関連する待機プールに入り、同時にオブジェクトのマシン ロックを解放します。他のスレッドがアクセスできるようにするには、notify メソッドとnotifyAll メソッドを使用して待機中のスレッドをウェイクアップします。

3.notify() とnotifyAll() の違いは何ですか?

スレッドがオブジェクトの wait() メソッドを呼び出した場合、スレッドはオブジェクトの待機プール内に存在し、待機プール内のスレッドはオブジェクトのロックをめぐって競合しません。

スレッドがオブジェクトのnotifyAll()メソッド(すべての待機スレッドをウェイクアップ)またはnotify()メソッド(ランダムに1つの待機スレッドのみをウェイクアップ)を呼び出すと、ウェイクアップされたスレッドはオブジェクトのロック・プールに入ります。ロック プール内のスレッドはオブジェクト ロックをめぐって競合します。つまり、notify を呼び出した後、1 つのスレッドだけが待機プールからロック プールに入り、notifyAll はオブジェクト待機プール内のすべてのスレッドをロック プールに移動して、ロックの競合を待機します。

優先度の高いスレッドは、オブジェクト ロックをめぐって競合する可能性が高くなります。スレッドがオブジェクト ロックをめぐって競合しない場合、そのスレッドはロック プールに残ります。スレッドが wait() メソッドを呼び出した場合のみです。もう一度待機プールに戻ります。オブジェクト ロックを競合するスレッドは、同期されたコード ブロックが実行されてオブジェクト ロックが解放されるまで実行を継続し、この時点で、ロック プール内のスレッドはオブジェクト ロックを競合し続けます。

4. スレッド run() と start() の違いは何ですか?

各スレッドは、特定の Thread オブジェクトに対応するメソッド run() を通じてその操作を完了します。メソッド run() はスレッド本体と呼ばれます。 Thread クラスの start() メソッドを呼び出してスレッドを開始します。

start() メソッドを使用してスレッドを開始し、真のマルチスレッド操作を実現します。このとき、run メソッド本体のコードが実行されるのを待つ必要はなく、直接次のコードの実行を続行できますが、この時点ではスレッドは準備完了状態にあり、実行されていません。次に、この Thread クラスを通じてメソッド run() を呼び出して、実行ステータスを完了します。ここでのメソッド run() はスレッド本体と呼ばれ、実行されるスレッドの内容が含まれます。Run メソッドが終了し、スレッドが終了します。次に、CPU は他のスレッドをスケジュールします。

run() メソッドはこのスレッドにありますが、これはスレッド内の単なる関数であり、マルチスレッドではありません。 run() を直接呼び出す場合、実際には通常の関数を呼び出すのと同じです。run() メソッドを直接使用する場合は、次のコードを実行する前に run() メソッドの実行が完了するまで待つ必要があります。まだ実行パスが 1 つだけであり、スレッドがまったくないという特性があるため、マルチスレッド実行時には run() メソッドの代わりに start() メソッドを使用する必要があります。

(推奨チュートリアル: java 入門プログラム )

5. スレッド プールを作成するにはどのような方法がありますか?

1. newFixedThreadPool(int nThreads)

固定長スレッド プールの作成タスクが送信されるたびに、スレッド プールの最大数に達するまでスレッドが作成されます。この時点では、スレッド サイズは変更されなくなり、予期しないエラーによってスレッドが終了すると、スレッド プールに新しいスレッドが補充されます。

2.newCachedThreadPool()

キャッシュ可能なスレッド プールを作成します。スレッド プールのサイズが処理需要を超える場合、アイドル状態のスレッドは自動的にリサイクルされます。需要が増加すると、新しいスレッドが自動的に追加されます。スレッド プールのサイズに制限はありません。 。

3. newSingleThreadExecutor()

これはシングルスレッドのエグゼキュータです。タスクを実行する単一のワーカー スレッドを作成します。このスレッドが異常終了した場合、新しいスレッドが作成されて置き換えられます。 ; it 特徴は、タスクがキュー内の順序に従ってシリアルに実行されることを保証することです。

4. newScheduledThreadPool(int corePoolSize)

固定長のスレッド プールを作成し、タイマーと同様に、遅延またはスケジュールされた方法でタスクを実行します。

その他の面接の質問については、java 面接の質問列に注目してください。

以上が2020 年の新しい Java 面接の質問 - マルチスレッド (2)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。