class  Resource
{
private boolean flag;
private String name;
private String sex;
public synchronized void set(String name,String sex)
{
if (flag)
{
try
{
this.wait();
}
catch (Exception e){}
}
else
{
this.name= name;
this.sex= sex;
flag= true;
this.notify();
}

}
public synchronized void out()
{
if (!flag) 
{
try
{
this.wait();
}
catch (Exception e){}
}
else
{
System.out.println("姓名:"+this.name+"  性别:"+this.sex);
flag= false;
this.notify();
} }
}
class Input implements Runnable
{
private Resource r;
Input(Resource r)
{
this.r= r;
}
public void run()
{
int x= 1;
while (true)
{
if (x==1)
{
r.set("mike","man-------");
}
else
{
r.set("丽丽","女");
}
x= (x+1)%2;
}
}
}
class Output implements Runnable
{
private Resource r;
Output(Resource r)
{
this.r= r;
}
public void run()
{
while (true)
{
r.out();
}
}
}class InputOutputDemo3 
{
public static void main(String[] args) 
{
Resource r= new Resource();
Input in= new Input(r);
Output ou= new Output(r);
Thread t1= new Thread(in);
Thread t2= new Thread(ou);
t1.start();
t2.start();
}
}

解决方案 »

  1.   

    LZ这段代码。Input线程陷入了死循环,不停地对公共资源进行同步set,Output线程获取自身对象锁进入同步run方法,开始进入等待,然后就一直处于waiting状态无法被唤醒。感觉逻辑问题还是挺多的,wait和notify不是这么用的。
      

  2.   

    那个死循环是有意设置的,我就是想交替打印,可是找不出问题,wait()和notify()好像是要用condition,我只是想让两个线程交替打印。
      

  3.   

    wait和notify需要指定一个对象锁,只能在对象锁内部成对使用(成对使用是针对不同的线程A和B),需要注意notify会在结束对应对象锁控制的同步块所有代码之后释放对应锁,除非遇到wait(),会使线程处于waiting状态并释放对应锁等待别的notify唤醒。