lz 你这是两个生产者两个消费者的问题,至于为什么用while不用if,那是因为当你其中一个生产者t1进入等待状态wait()时而t2在执行下面程序时this.name=name+"--"+count++;(假如count=1),执行完后flag=true他也进入等待中,这时t1,t2都在线程池中等待,而t2是先进去的,等到下一次消费者唤醒线程池this.notify();时t2先醒来,t2的位置在try {this.wait();} catch (Exception e) {}这里,醒来后是if(flag),他就不会再去判断flag是否还是true就继续执行this.name=name+"--"+count++;这导致生产者一下生产了两(本题原意是生产一个消费一个吧,楼主) 醒来后是while(flag) ,他就会在判断flag,这时他知道flag为true就不会在生产。
不知道楼主是否能明白我的意思,其实毕老师day12-5视频中讲得很清楚,你可以多看几遍,还有指出lz你的一个小错误:09.this.notifyAll(); //一般唤醒线程池中的所有线程不是一个;this.notify();才是唤醒线程池中第一个。 |