-
オブジェクトのすべての状態は何ですか
Thread
?- 新しい
- 実行可能
- ブロックされました
- 待っている
- TIMED_WAITING
- 終了しました
-
スレッドがブロックに入るときに移行できる状態は何ですか
synchronized
?- 実行可能
- ブロックされました
RUNNABLE では、マークされたコードのブロックが
synchronized
別のスレッドによって占有されていない場合。それ以外の場合、スレッドは BLOCKED 状態を受け取り、ミューテックス オブジェクトが解放されるのを待ちます。 - メソッドを呼び出すとスレッドはどの状態になりますか
wait()
?このメソッドを呼び出すと、スレッドは WAITING 状態になります。
このメソッドは、現在のスレッドによって「ロック」されているミューテックス オブジェクトのwait()
ブロック内でのみ呼び出すことができますsynchronized
。それ以外の場合、メソッドはIllegalMonitorStateException例外をスローします。Object monitor = getMonitor(); synchronized(monitor) { … monitor.wait(); … }
メソッドが呼び出されるとwait()
、現在のスレッドはオブジェクトのロックを解放し、WAITING 状態に入り、別のスレッドによってmonitor
メソッドが呼び出されるのを待ちます。これが発生するとすぐにスレッドが起動し、モニターがビジー状態でなければ、スレッドを取得して作業を続行します。 モニターが別のスレッドによって占有されている場合、現在のスレッドは BLOCKED 状態になります。monitor.notify()
monitor.notifyAll()
-
メソッドを呼び出すとスレッドはどの状態になりますか
このメソッドを呼び出すと、スレッドが TIMED_WAITING 状態になります。wait(500)
?
メソッドと同様にwait()
、このメソッドは、現在のスレッドによって「ロック (ロック)」されているミューテックス オブジェクトのwait(timeout)
ブロック内でのみ呼び出すことができます。synchronized
Object monitor = getMonitor(); synchronized(monitor) { … monitor.wait(500); … }
メソッドを呼び出すと
wait()
、現在のスレッドはオブジェクトからロックを解放しmonitor
、500 ミリ秒間スリープ状態になります。オブジェクトはmonitor
別のスレッドによってキャプチャされる可能性があります。
500 ミリ秒後、スレッドが起動し、monitor
ビジーでなければ、スレッドを取得して作業を続けます。
モニターが別のスレッドによって占有されている場合、現在のスレッドは BLOCKED 状態になります。メソッドを呼び出すとスレッドはどの状態になりますか
notify()
?Object monitor = getMonitor(); synchronized(monitor) { … monitor.wait(); … }
の後monitor.wait()
、スレッドは WAITING 状態になります。notify()
オブジェクト上の別のスレッドによって呼び出されたメソッドは、monitor
モニター オブジェクトが別のスレッドによってキャプチャされない限り、スレッドを WAITING 状態から RUNNABLE 状態に移行し、そうでない場合は BLOCKED 状態に移行します。 -
メソッドを呼び出すとスレッドはどの状態になりますか
notifyAll()
?notifyAll()
すべてのスレッドが「残ります」。すべての「スリープ」(待機) スレッドの 1 つが RUNNABLE 状態になり、使用されているオブジェクトのモニターを引き継ぎ、その作業を続行します。残りは BLOCKED 状態になります。最初の「ウェイクアップ」スレッドが他の全員が待機しているモニターを解放するとすぐに、その運命は次のスレッドによって繰り返されます (任意のスレッドが BLOCKED 状態から RUNNABLE 状態に移行します)。これは、すべての「目覚めた」スレッドが BLOCKED 状態を解除するまで続きます。 -
同期ブロック内の 3 つのスレッドは、
そのうち 2 つは BLOCKED 状態になり、1 つは RUNNABLE 状態になりますwait()
ミューテックス オブジェクトと呼ばれます。4 番目のスレッドが呼び出した場合、これらのスレッドはどのような状態になりますかnotifyAll()
? -
と が現在のスレッドを TIMED_WAITING 状態に転送するという事実にもかかわらず、それらの間には大きな違いがあります。join(500)
とどう違うのですかwait(500)
?join(500)
スレッド 上で呼び出されるか、このブロックが同期されているオブジェクトの同期ブロック内で呼び出されるかです。 呼び出されると、現在のスレッドはメソッドが呼び出されたスレッドが完了するまで 500 ミリ秒待機します。 呼び出されると、現在のスレッドは同期されたオブジェクトからロックを解放し、500 ミリ秒間スリープ状態になります。 500 ミリ秒後、どちらの場合もスレッドは動作し続けます。wait(500)
join(500)
wait(500)
join(500)
join()
wait(500)
-
wait(500)
とどう違うのですかsleep(500)
?sleep(500)
スレッド上で呼び出され、wait(500)
このブロックが同期されているオブジェクトの同期ブロック内で呼び出されます。
呼び出されると、sleep(500)
現在のスレッドは 500 ミリ秒待機してから作業を続行します。
呼び出されると、wait(500)
現在のスレッドは同期されたオブジェクトからロックを解放し、500 ミリ秒間スリープ状態になります。 -
メソッドを呼び出すとスレッドはどの状態になりますか
メソッドが呼び出されるとyield()
?yield()
、現在のスレッドは「順番をスキップ」し、Java はすぐに次のスレッドの実行に切り替えます。スレッドは状態からrunning
状態へと移行しますready
。実行中および準備完了状態は、RUNNABLE 状態のサブ状態です。
GO TO FULL VERSION