4

スレッドがブロック状態になるさまざまな方法があることを確認しました。スレッドがブロック状態になった後に正確に何が起こるか知りたいです。どのようにして実行中の状態に戻りますか。sleep(time) によってブロックされた場合、time ミリ秒後に実行可能なキューに移動します。I/O 操作でブロックされた場合、それが完了すると実行可能なキューに入ります。オブジェクトのロックを待機しているときに、実行可能なキューに到達する方法。待っているオブジェクトのロックが利用可能になったことをどうやって知るのでしょうか。I / Oでブロックされたスレッドがどのように機能するかの内部を説明できる人もいます。上記のトピックのいずれかについての私の理解が正しくない場合は、修正してください..

ありがとうございました

4

3 に答える 3

3

オブジェクトのロックを待機しているときに、実行可能なキューに到達するにはどうすればよいですか?

ブロックに入ろうとしたためにスレッドがブロックされsynchronizedた場合、他のスレッド (ロックを保持している) がsynchronized同じオブジェクトのブロックを終了することによってロックを解放すると、スレッドは自動的に実行可能としてマークされます。

の呼び出しによって現在のスレッドがブロックされているsomeObject.wait()場合、別のスレッドが を呼び出すと、そのスレッドは「解放」されますsomeObject.notify()

バイトコード レベルでは、次のようになります。

[load some object, obj, onto the operand stack]
monitorenter  // grab the lock

// do stuff

[load obj onto the operand stack again] 
monitorexit   // release the lock

他の誰かがすでに のロックを保持している場合、そのスレッドは他のスレッドが を呼び出すまでobjハングアップします。monitorentermonitorexit

monitorenter実装方法およびmonitorexit実装すべき正確な詳細は、JLS によって指定されていません。つまり、JVM/OS 依存です。

詳細については、JLS 待機セットと通知を参照してください。

于 2011-01-25T14:21:46.453 に答える
0

コードに近いレベルでは、次のようになります。

スレッド 1:

Object mutex = new Object();
....
synchronized(mutex) {
    //lock to mutex is acquired.
    mutex.wait(); //lock to mutex is released. Thread is waiting for somebody to call notify().
    doSomething();
}

スレッド 2:

synchronized(Thread1.mutex) {
    //acquires the lock on mutex. 
    //Can be done only after mutex.wait() is called from Thread1
    // and the lock is released
    Thread1.mutex.notify(); // notifies Thread1 that it can be resumed.
}

一般に、Thread.sleep() はリソースのロックを保持しますが、Thread.wait() はロックを解放し、他のスレッドから通知を受けることができることに注意してください。

于 2011-01-25T14:22:46.167 に答える
-1

AFAIK JVM はネイティブ スレッドを使用します。したがって、スレッドのスケジュールとコンテキストの切り替えを管理するのは、JVM ではなく OS です。

実際の JVM ソース コードを確認できます。開いています。

于 2011-01-25T14:23:18.997 に答える