夜光:Java多线程学习笔记(六)在校资源

本文通过两个示例深入探讨Java中线程的同步机制与Wait-Notify的运用。首先,银行存款和取款操作展示了如何使用synchronized关键字确保线程安全。其次,售票系统的案例解释了如何利用Wait-Notify实现线程间的等待与唤醒,以协调资源的分配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

夜光序言:

 

我注视着他的脸欣赏了好久,像黄昏的天色那样温柔和明朗。

 

 

 

 

 

 

 

正文: 线程的同步

 

 

 

//  夜光

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();
    }
}

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值