public class ThreadB extends Thread {
int total;

@Override
public void run() {
synchronized (this) {
for(int i = 0 ; i < 10 ; i++){
total += i;
}
notify();
//System.out.println(total);
}
}
}class ThreadA{
public static void main(String[] args){
ThreadB b = new ThreadB();

b.start();

try{
Thread.sleep(1000); }catch(Exception e){
e.printStackTrace();
}

//synchronized (Thread.currentThread()) {
synchronized (b) {
System.out.println("aaa");
try{
//Thread.currentThread().wait();
b.wait();
}catch(Exception e){
e.printStackTrace();
}


}

System.out.println(b.total);
}

}

解决方案 »

  1.   

    为什么红色的地方被注释掉才会执行b.wait语句呢
      

  2.   

    咱们的电脑运行速度非常快,主线程等了一秒,那么ThreadB 线程应该都运行完了,此时main线程进入到synchronized 块中,打印出aaa然后就wait在那里,由于ThreadB 线程执行完毕,所以没有人去notify main线程,所以就一直等在那里。
      

  3.   

    To followme_1987
    main线程能进入到synchronized块中么?
    那么synchronized块到底是在做什么呢?
      

  4.   


    main线程能进入到synchronized块中么?
    那么synchronized块到底是在做什么呢?不是刚进入synchronized块就阻止了main线程了么?
    为什么还要打出aaa呢?
      

  5.   

    是不是在synchronized块中,b对象的用synchronized修饰的方法都处于线程安全状态,而且这时候还没有阻止main线程,而当wait方法执行的时候,阻止了b所在的线程,也就是main?