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

版权声明: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();
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_41987706/article/details/91361586