版权声明:Genius https://blog.csdn.net/weixin_41987706/article/details/91361586
夜光序言:
我注视着他的脸欣赏了好久,像黄昏的天色那样温柔和明朗。
正文: 线程的同步
// 夜光
public class ThreadSynchronization
{
public static void main(String args[])
{
Bank bank=new Bank();
bank.setMoney(200);
System.out.println("目前帐上有"+bank.money+"万");
Thread accountant,cashier;//会计,出纳两个线程
accountant=new Thread(bank);
cashier=new Thread(bank);
accountant.setName("会计");
cashier.setName("出纳");
accountant.start();
cashier.start();
}
}
class Bank implements Runnable
{
int money=200;
public void setMoney(int n)
{ money=n;
}
public void run()
{
if(Thread.currentThread().getName().equals("会计"))
saveOrTake(300);
else if(Thread.currentThread().getName().equals("出纳"))
saveOrTake(150);
}
public synchronized void saveOrTake(int amount)
{ //存取方法
if(Thread.currentThread().getName().equals("会计"))
{
for(int i=1;i<=3;i++){
money=money+amount/3; //每存入amount/3,稍歇一下
System.out.println(Thread.currentThread().getName()+"存入"+amount/3+",帐上有"+money+"万,休息一会再存");
try {Thread.sleep(1000); //这时出纳仍不能使用saveOrTake方法
}
catch(InterruptedException e) {}
}
}
else if(Thread.currentThread().getName().equals("出纳"))
{
for(int i=1;i<=3;i++)
{
money=money-amount/3; //每取出amount/3,稍歇一下
System.out.println(Thread.currentThread().getName()+"取出"+amount/3+",帐上有"+money+"万,休息一会再取");
try {Thread.sleep(1000); //这时会计仍不能使用saveOrTake方法
}
catch(InterruptedException e) {}
}
}
}
}
// 夜光
public class WaitandNotifyDemo
{
public static void main(String args[])
{
TicketSaler saler=new TicketSaler();
Thread zhangsan,lisi;
zhangsan=new Thread(saler);
zhangsan.setName("张三");
lisi=new Thread(saler);
lisi.setName("李四");
zhangsan.start();
lisi.start();
}
}
class TicketSaler 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) //如果使用该方法的线程传递的参数是5,就不用等待
{
fiveAmount=fiveAmount+1;
System.out.println("给"+Thread.currentThread().getName()+"入场券,"+Thread.currentThread().getName()+"的钱正好");
}
else if(money==20)
{
while(fiveAmount<3)
{
try
{ System.out.println("\n"+Thread.currentThread().getName()+"靠边等...");
wait();
System.out.println("\n"+Thread.currentThread().getName()+"继续买票");
}
catch(InterruptedException e) {}
}
fiveAmount=fiveAmount-3;
twentyAmount=twentyAmount+1;
System.out.println("给"+Thread.currentThread().getName()+"入场券,"+Thread.currentThread().getName()+"给20,找回15元");
}
notifyAll();
}
}