下面的程序有什么问题?Java wait/notify不工作

下面的程序有什么问题?Java wait/notify不工作,java,multithreading,Java,Multithreading,当试图在程序下面运行时,它在“In consume”之后被挂起 public类MyThreadNew{ 公共静态void main(字符串[]args){ Object obj=新对象(); 布尔生成=真; 螺纹t1=新螺纹(新P(obj,生产)); 螺纹t2=新螺纹(新C(obj,产品)); t1.start(); t2.start(); } } 类P实现可运行的{ 公共对象对象; 公共静态布尔生成; 公共P(对象对象,布尔生成){ obj=obj; P.生产=生产; } 公共产品{ 同步(

当试图在程序下面运行时,它在“In consume”之后被挂起

public类MyThreadNew{
公共静态void main(字符串[]args){
Object obj=新对象();
布尔生成=真;
螺纹t1=新螺纹(新P(obj,生产));
螺纹t2=新螺纹(新C(obj,产品));
t1.start();
t2.start();
}
}
类P实现可运行的{
公共对象对象;
公共静态布尔生成;
公共P(对象对象,布尔生成){
obj=obj;
P.生产=生产;
}
公共产品{
同步(obj){

对于(int i=1;i如果
p
的线程首先启动,则

for (int i = 1; i <= 10; i++) {
    System.out.print(i + " : ");
}
C.produce = false;
然后在
synchronized
处阻塞。另一个线程再次启动,调用
notifyAll()
,然后离开其
synchronized
块。具有
C
的线程再次启动并调用

obj.wait();
阻止应用程序,因为没有任何东西可以通知它

即使
C
首先启动,它也无法通过
if
处理,您也会得到相同的行为


(另请注意,
product
应该是
volatile

如果带有
p
的线程首先启动,您将得到

for (int i = 1; i <= 10; i++) {
    System.out.print(i + " : ");
}
C.produce = false;
然后在
synchronized
处阻塞。另一个线程再次启动,调用
notifyAll()
,然后离开其
synchronized
块。具有
C
的线程再次启动并调用

obj.wait();
阻止应用程序,因为没有任何东西可以通知它

即使
C
首先启动,它也无法通过
if
处理,您也会得到相同的行为

(另请注意,
product
应为
volatile

obj.wait();