多线程—wait,notify(针对方法synchronized)

这种方式的实现,主要应对的场景是,生产者和消费者模式。
生产者 和 消费者,看成是两个线程,或者是多线程.

生产者 等待消费者把 把蛋糕吃掉,才能有盘子生产

消费者 等待生产者 生产蛋糕,才有蛋糕吃

啥都不说,直接把代码贴上来。模仿其他人的。

package com.luoy.Thread.wait;

import java.text.SimpleDateFormat;
import java.util.Date;


public class PlantBean{

   public static void main(String[] args){
      //使用共享变量  多线程才能实现  
      Plant p = new Plant();

      new Thread(new GetCake(p)).start();
      new Thread(new PutCake(p)).start();
   }

}

class GetCake implements Runnable{

   private Plant p;


   public GetCake(Plant p){
      this.p = p;
   }

   @Override
   public void run(){
      for(int i = 0; i < 10; i++){
         //工作十次
         p.getCakes();
      }

   }

}

class PutCake implements Runnable{

   private Plant p;


   public PutCake(Plant p){
      this.p = p;
   }

   @Override
   public void run(){
      for(int i = 0; i < 10; i++){
         //工作十次
         p.putCakes();
      }

   }

}

class Plant{
   //假设这是盘子对象
   private static String plant = "";


   //放蛋糕 操作
   public synchronized void putCakes(){
      while(!"".equalsIgnoreCase(plant)){
         //当盘子 不是空的,就不能放蛋糕  等待
         try{
            wait();
         }catch(InterruptedException e){
            // TODO Auto-generated catch block
            e.printStackTrace();
         }
      }

      //空的 
      SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:sss");
      //放入蛋糕
      plant = "蛋糕-日期"+df.format(new Date());
      try{
         Thread.sleep(1000);
      }catch(InterruptedException e){
         // TODO Auto-generated catch block
         e.printStackTrace();
      }
      System.out.println("放入:"+plant);
      //通知等待中的线程- 取蛋糕出来
      notify();
   }

   //取蛋糕
   public synchronized void getCakes(){
      while("".equalsIgnoreCase(plant)){
         //当盘子是空的,不能取蛋糕  等待
         try{
            wait();
         }catch(InterruptedException e){
            // TODO Auto-generated catch block
            e.printStackTrace();
         }
      }

      //盘子不为空 取蛋糕
      SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:sss");
      //放入蛋糕
      System.out.println("取走蛋糕:"+plant);
      plant = "";
      //通知等待中的线程- 放蛋糕
      notify();
   }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值