4

ここで説明が必要です。

 public static void main(String[] args) {
    FirstThread obj = new FirstThread();
    for (int i = 1; i <= 10; i++) {
      new WaiterThread(obj).start();
    }
    obj.start();
  }

public class FirstThread extends Thread {
  @Override
  public void run() {
    // Do something
  }
}


public class WaiterThread extends Thread {
  Object obj;

  WaiterThread(Object obj) {
    this.obj = obj;
  }

  @Override
  public void run() {
    synchronized (obj) {
           obj.wait();
    }
  }
}

WaiterThread用に 10 個のスレッドが作成され、単一のFirstThreadオブジェクトを待機しています。FirstThread が終了した後、 obj.notify()またはobj.notifyAll()が呼び出されることなく、すべてのWaiterThreadが再開されます。

これは、 WaiterThread が終了したため、FirstThread待機を停止したということですか?

4

3 に答える 3

6

これは、スレッドが終了するときに this.notifyAll() を呼び出すという事実の副作用です ( の javadoc に記載されていますThread.join())。同じ javadoc では、次の推奨事項も示されています。

アプリケーションがスレッド インスタンスで wait、notify、または notifyAll を使用しないことをお勧めします。

于 2013-08-22T08:45:12.207 に答える
0

以下のようにコードを少し修正しました

main() メソッドは同じままです

 public static void main(String[] args) {
    FirstThread obj = new FirstThread();
    for (int i = 1; i <= 10; i++) {
      new WaiterThread(obj).start();
    }
    obj.start();
  }

変更は以下の通り

class WaiterThread extends Thread {
    Object obj;

    WaiterThread(Object obj) {
        this.obj = obj;
    }

    @Override
    public void run() {
        synchronized (obj) {
            try {
                obj.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Thread " + this.getId() + "started");
        }
        System.out.println("Out of sync block by " + this.getId());
    }
}

私が得た出力は

FirstThread Started
Thread 19started
Out of sync block by 19
Thread 18started
Out of sync block by 18
Thread 17started
Out of sync block by 17
Thread 16started
Out of sync block by 16
Thread 15started
Out of sync block by 15
Thread 14started
Out of sync block by 14
Thread 13started
Out of sync block by 13
Thread 12started
Out of sync block by 12
Thread 11started
Out of sync block by 11
Thread 10started
Out of sync block by 10

だからあなたはあなたの答えを持っています。それらは同時に開始されません!FirstThread は、停止中に notifyAll() を呼び出します。これにより、各スレッドを除くすべてのスレッドが一度に 1 つのみロックできることが通知されます。そのため、すべてのスレッドに通知されますが、一度に実行されるスレッドは 1 つだけです。

于 2013-08-22T08:46:46.937 に答える