//等待唤醒机制
/***
等待的线程放在线程池
wait()、notify()、notifyall()都使用在同步中,因为要对持有监视器(锁)的线程操作。
所以要使用在同步中,因为只有同步才具有锁。
为什么这些操作线程的方法要定义Object类中呢?
因为这些方法操作同步中的线程时,都必须要表示它们所操作线程持有的锁,
只有同一个锁上的被等待线程,可以被同一个锁上的notify()唤醒。
也就是说,等待和唤醒必须是在同一个锁。
而锁可以是任意对象,所以可以被任意对象调用的方法定义Object类中。
*/
class Info
{
String name;
String sex;
boolean flag=false;
}
class Input implements Runnable
{
private Info i;
Input(Info i)
{
this.i=i;
}
public void run()
{
int x=0;
while(true)
{
synchronized(i)
{
if(i.flag==true)
try{i.wait();}catch(Exception e){}
if(i.flag==false)
{
if(x==0)
{
i.name="张飞";
i.sex="女";
}
else
{
i.name="李四";
i.sex="男";
}
x=(x+1)%2;
i.flag=true;
i.notify();
}
}
}
}
}
class Output implements Runnable
{
private Info i;
Output(Info i)
{
this.i=i;
}
public void run()
{
while(true)
{
synchronized(i)
{
if(i.flag==false)
try{i.wait();}catch(Exception e){}
if(i.flag==true)
{
System.out.println(i.name+"........"+i.sex);
}
i.flag=false;
i.notify();
}
}
}
}
class 线程笔记_等待唤醒机制
{
public static void main(String[] args)
{
Info i=new Info();
Input in=new Input(i);
Output out=new Output(i);
Thread t1=new Thread(in);
Thread t2=new Thread(out);
t1.start();
t2.start();
}
}