130

スレッド状態 WAIT とスレッド状態 BLOCKED の違いは何ですか?

Thread.Stateドキュメント:

ブロック済み
モニター・ロックを待ってブロックされているスレッドは、この状態にあります。

待機
中 別のスレッドが特定のアクションを実行するのを無期限に待機しているスレッドは、この状態にあります

私に違いを説明しません。

4

6 に答える 6

105

違いは比較的単純です。

このBLOCKED状態では、スレッドがブロックに入ろうとしていますが、同じオブジェクトsynchronizedのブロック内で別のスレッドが現在実行されています。synchronized最初のスレッドは、2 番目のスレッドがそのブロックを終了するまで待機する必要があります。

このWAITING状態では、スレッドは別のスレッドからのシグナルを待っています。これは通常、Object.wait()、またはを呼び出すことによって発生しThread.join()ます。スレッドは、別のスレッドが を呼び出すか終了するまで、この状態のままになりますObject.notify()

于 2013-03-28T11:24:55.280 に答える
104

wait()オブジェクトを呼び出すと、スレッドは待機状態になります。これを待機状態と呼びます。スレッドが待機状態に達すると、他のスレッドが呼び出されるまで、notify()またはnotifyAll()オブジェクトで待機する必要があります。

このスレッドが通知されると、実行できなくなります。他のスレッドにも ( を使用してnotifyAll()) 通知されるか、最初のスレッドが作業を完了していない可能性があります。これをブロック状態と呼びます。ブロック状態は、スレッドがオブジェクトのロックを取得しようとし、他のスレッドが既にロックを保持している場合に発生します。

他のスレッドが終了し、このスレッド チャンスが発生すると、Runnable 状態に移行し、その後、JVM スレッド化メカニズムに基づいて作業をピックアップする資格があり、run 状態に移行します。

于 2013-03-28T11:26:56.313 に答える
24

スレッド ダンプを解釈するための単純化されたパースペクティブ:

  • WAIT - 仕事が与えられるのを待っているので、今はアイドル状態です。
  • BLOCKED - 私は仕事を終わらせようとして忙しいのですが、別のスレッドが私の邪魔をしているので、今はアイドル状態です。
  • RUNNABLE ...(Native Method) - JVM に関する限り、あなたは RUNNABLE であり、それ以上の情報を提供することはできません。一般的な例は、C でコーディングされたネイティブ ソケット リスナー メソッドで、実際にはトラフィックの到着を待っているため、現在はアイドル状態です。そのような状況では、実際には RUNNING (CPU バーンなし) ではないため、これは特別な種類の WAIT と見なすことができますが、それを確認するには Java スレッド ダンプではなく OS スレッド ダンプを使用する必要があります。
于 2016-02-28T10:17:38.927 に答える
-1

次の例を参照してください。

スレッド状態のデモンストレーション。

/*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();
        }
    }
}
}
于 2017-05-07T11:02:50.483 に答える