スレッド状態 WAIT とスレッド状態 BLOCKED の違いは何ですか?
Thread.Stateドキュメント:
ブロック済み
モニター・ロックを待ってブロックされているスレッドは、この状態にあります。待機
中 別のスレッドが特定のアクションを実行するのを無期限に待機しているスレッドは、この状態にあります
私に違いを説明しません。
スレッド状態 WAIT とスレッド状態 BLOCKED の違いは何ですか?
Thread.Stateドキュメント:
ブロック済み
モニター・ロックを待ってブロックされているスレッドは、この状態にあります。待機
中 別のスレッドが特定のアクションを実行するのを無期限に待機しているスレッドは、この状態にあります
私に違いを説明しません。
違いは比較的単純です。
このBLOCKED
状態では、スレッドがブロックに入ろうとしていますが、同じオブジェクトsynchronized
のブロック内で別のスレッドが現在実行されています。synchronized
最初のスレッドは、2 番目のスレッドがそのブロックを終了するまで待機する必要があります。
このWAITING
状態では、スレッドは別のスレッドからのシグナルを待っています。これは通常、Object.wait()
、またはを呼び出すことによって発生しThread.join()
ます。スレッドは、別のスレッドが を呼び出すか終了するまで、この状態のままになりますObject.notify()
。
wait()
オブジェクトを呼び出すと、スレッドは待機状態になります。これを待機状態と呼びます。スレッドが待機状態に達すると、他のスレッドが呼び出されるまで、notify()
またはnotifyAll()
オブジェクトで待機する必要があります。
このスレッドが通知されると、実行できなくなります。他のスレッドにも ( を使用してnotifyAll()
) 通知されるか、最初のスレッドが作業を完了していない可能性があります。これをブロック状態と呼びます。ブロック状態は、スレッドがオブジェクトのロックを取得しようとし、他のスレッドが既にロックを保持している場合に発生します。
他のスレッドが終了し、このスレッド チャンスが発生すると、Runnable 状態に移行し、その後、JVM スレッド化メカニズムに基づいて作業をピックアップする資格があり、run 状態に移行します。
スレッド ダンプを解釈するための単純化されたパースペクティブ:
次の例を参照してください。
スレッド状態のデモンストレーション。
/*NEW- thread object created, but not started.
RUNNABLE- thread is executing.
BLOCKED- waiting for monitor after calling wait() method.
WAITING- when wait() if called & waiting for notify() to be called.
Also when join() is called.
TIMED_WAITING- when below methods are called:
Thread.sleep
Object.wait with timeout
Thread.join with timeout
TERMINATED- thread returned from run() method.*/
public class ThreadBlockingState{
public static void main(String[] args) throws InterruptedException {
Object obj= new Object();
Object obj2 = new Object();
Thread3 t3 = new Thread3(obj,obj2);
Thread.sleep(1000);
System.out.println("nm:"+t3.getName()+",state:"+t3.getState().toString()+
",when Wait() is called & waiting for notify() to be called.");
Thread4 t4 = new Thread4(obj,obj2);
Thread.sleep(3000);
System.out.println("nm:"+t3.getName()+",state:"+t3.getState().toString()+",After calling Wait() & waiting for monitor of obj2.");
System.out.println("nm:"+t4.getName()+",state:"+t4.getState().toString()+",when sleep() is called.");
}
}
class Thread3 extends Thread{
Object obj,obj2;
int cnt;
Thread3(Object obj,Object obj2){
this.obj = obj;
this.obj2 = obj2;
this.start();
}
@Override
public void run() {
super.run();
synchronized (obj) {
try {
System.out.println("nm:"+this.getName()+",state:"+this.getState().toString()+",Before Wait().");
obj.wait();
System.out.println("nm:"+this.getName()+",state:"+this.getState().toString()+",After Wait().");
synchronized (obj2) {
cnt++;
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Thread4 extends Thread{
Object obj,obj2;
Thread4(Object obj,Object obj2){
this.obj = obj;
this.obj2 = obj2;
this.start();
}
@Override
public void run() {
super.run();
synchronized (obj) {
System.out.println("nm:"+this.getName()+",state:"+this.getState().toString()+",Before notify().");
obj.notify();
System.out.println("nm:"+this.getName()+",state:"+this.getState().toString()+",After notify().");
}
synchronized (obj2) {
try {
Thread.sleep(15000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}