2

我找不到为什么 ThreadA 仅在 ThreadB 完全完成它的工作时才从 ThreadB 收到通知的原因。如果我评论 notify() ThreadA 无论如何都会收到通知。

ThreadB 完成工作后会自动发送通知吗?

为什么 ThreadB 没有按时通知 ThreadA?

class ThreadA {
      public static void main(String [] args) {
         ThreadB b = new ThreadB();

         b.start();

         synchronized(b) 
         {

            try {
               System.out.println("Waiting for b to complete...");
               b.wait();
               System.out.println("waiting done");
               } catch (InterruptedException e) {}

           System.out.println("Total is: " + b.total);

        }
     }
  }





class ThreadB extends Thread {   
     int total=0; 
     public void run() {
        synchronized(this) 
        {


           for(int i=0;i<10;i++) 
           {
              System.out.println(Thread.currentThread().getName()+" "+ Integer.toString(i));
              total += i;
           }


           notify();
           System.out.println("notify done");

           for(int i=0;i<100;i++) 
           {
              System.out.println(Thread.currentThread().getName()+" "+ Integer.toString(i));
              total += i;
           }

        }
     }
  }

输出:

Waiting for b to complete...
Thread-0 0
Thread-0 1
Thread-0 2
Thread-0 3
Thread-0 4
Thread-0 5
Thread-0 6
Thread-0 7
Thread-0 8
Thread-0 9
notify done
Thread-0 0
Thread-0 1
Thread-0 2
Thread-0 3
Thread-0 4
Thread-0 5
Thread-0 6
Thread-0 7
Thread-0 8
Thread-0 9
Thread-0 10
Thread-0 11
Thread-0 12
Thread-0 13
Thread-0 14
Thread-0 15
Thread-0 16
Thread-0 17
Thread-0 18
Thread-0 19
waiting done
Total is: 235

附加问题 - 为什么 Total 输出为 235?

4

1 回答 1

5

首先,不要使用Thread这样的对象。Thread使用waitnotify本身,所以你很容易得到令人困惑的信号。

您直到最后才看到“等待完成”的原因是,尽管ThreadB.run调用了,但它仍然blocknotify()内继续进行。在重新获取监视器之前,该方法不会返回 - 在同步块结束之前它无法执行此操作。synchronizedwait()

总数只是将所有数字相加的总数 - 看起来您实际上已经运行了第二个限制 20,而不是 10... 和 (0 + 1 + 2 + ... 9) + (0 + 1 + 2 + ... 19) 是 235。目前尚不清楚为什么你会期待其他任何东西。

于 2013-09-26T10:41:00.280 回答