2011-01-25 6 views
4

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

はそれがロックしたオブジェクトの上に待機しているときにどのようにそれが実行可能キューに取得ん

答えて

3

ありがとう?

スレッドが原因​​ブロックを入力しようとするとブロックされている場合、他のスレッド(ロックを保持している)は、同じオブジェクトの​​ブロックから出てロックを解除するとき、スレッドは自動的に実行可能としてマークされています。

someObject.wait()の呼び出しのために現在のスレッドがブロックされている場合、別のスレッドがsomeObject.notify()を呼び出すと、そのスレッドは「解放」されます。バイトコードレベルで

次のようになります。他のスレッドがmonitorexitを呼び出すまで

[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のロックを保持している場合、スレッドはmonitorenterにハングアップします。

monitorentermonitorexitの実装方法の詳細は、JLSでは指定されていません。つまり、JVM/OSに依存します。

詳細については、JLS Wait Sets and Notificationsを参照してください。それはこのようになります近いツーコードレベルで

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()はロックを解除し、他のスレッドから通知を受けることができます。

0

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

実際のJVMソースコードを見ることができます。それは開いている。

+0

明示的にSuns/Oracles Hotspot JVMを参照している場合は、これを明確にすることができます。 – aioobe

+1

JVMのソースについての記事:http://stackoverflow.com/questions/2026093/is-jvm-open-source-code-if-not-how-can-i-get-code-of-jvm – 9dan

関連する問題