/*
协调同步的线程
需求: 两个人买票,售货员只有2张5元
票5元一张,张三拿20排在李四前买票
李四拿一张5元买票
当一个线程使用的同步方法中用到某个需要其他线程修改后的变量,
可在同步方法中使用wait方法。
*/
class TicketHouse implements Runnable
{
int fiveAmount=2,tenAmount=0,twentyAmount=0;
public void run()
{
if(Thread.currentThread().getName().equals("张三"))
{
saleTicket(20);
}
else if(Thread.currentThread().getName().equals("李四"))
{
saleTicket(5);
}
}
private synchronized void saleTicket(int money)
{
if(money==5)
{
fiveAmount+=1;
System.out.println(Thread.currentThread().getName()+"付的钱正好,买到入场券");
}
else if(money==20)
{
while(fiveAmount<3) //没钱找,靠边等
{
try
{
System.out.println(Thread.currentThread().getName()+"靠边等....");
wait();
System.out.println(Thread.currentThread().getName()+"继续买票");
}
catch(InterruptedException e){}
}
fiveAmount-=3;
twentyAmount+=1;
System.out.println(Thread.currentThread().getName()+"买到票,付20找零15");
}
notifyAll();
}
}
class SaleTicketDemo
{
public static void main(String[] args)
{
TicketHouse t=new TicketHouse();
Thread t1=new Thread(t);
Thread t2=new Thread(t);
t1.setName("张三");
t2.setName("李四");
t1.start();
t2.start();
}
}
|
|