生产者消费者

生产者消费者模式是一个十分经典的多线程协作的模式,


    // 生产者步骤:
    //  1 判断桌子上是否有汉堡包
    //  如果有就等待,如果没有才生产
    // 2 把汉堡包放在桌子上。
    // 3 叫醒等待待的消费者开吃。

// 消费者
// 1 判断桌上是否有汉堡包
// 2  如果没有就等待
// 3  如果有就开吃
// 4  吃完后,桌子上的汉堡包就没有了,叫醒等待的生产者继续生产
// 汉堡包的总数减去一

package thredDemo14;

public class Cooker extends Thread{
    
    private Desk desk;

    public Cooker(Desk desk){
        this.desk = desk;
    }
    
    // 生产者步骤:
    //  1 判断桌子上是否有汉堡包
    //  如果有就等待,如果没有才生产
    // 2 把汉堡包放在桌子上。
    // 3 叫醒等待待的消费者开吃。
    
    @Override
    public void run() {
        while(true){
            synchronized (desk.getLock()) {
                if (desk.getCount() == 0){
                    break;
                }else{
                    if (!desk.isFlag()){
                        // 生产
                        System.out.println("厨师正在生产汉堡包");
                        desk.setFlag(true);
                        desk.getLock().notifyAll();
                        desk.setCount(desk.getCount()+1);
                    }else{
                        try {
                            desk.getLock().wait();
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                    
                }
            }
        }
    }


}
 

package thredDemo14;

public class Foodie extends Thread{
// 消费者
// 1 判断桌上是否有汉堡包
// 2  如果没有就等待
// 3  如果有就开吃
// 4  吃完后,桌子上的汉堡包就没有了,叫醒等待的生产者继续生产
// 汉堡包的总数减去一
private Desk desk;

public Foodie(Desk desk){
    this.desk = desk;
}
    
    
@Override
public void run() {
    // TODO Auto-generated method stub
   while(true){
       synchronized (desk.getLock()) {
           if (desk.getCount() == 0){
               break;
           }else{
               if(desk.isFlag()){
                   // 有
                   System.out.println("吃货在吃汉堡包");
                   desk.setFlag(false);
                   desk.getLock().notifyAll();
                   desk.setCount(desk.getCount()-1);
               }
               
               try {
                desk.getLock().wait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
           }
        
    }
   }
}
}
 

package thredDemo14;

public class Desk {
     
    // 定义一个标记
    // true  就表示桌子上有汉堡包的,此时允许吃货执行
    // false 表示桌子上没有汉堡包的,此时允许厨师执行
    
    //public static boolean flag = false;
    
    // 汉堡包的总数
//    public static int count = 10;
    
    // 锁对象
//    public static final Object  lock = new Object();
    
    private boolean flag;
    
    private int count = 10;
    
    private final Object lock = new Object();
    

    public Desk() {
        
    }

    public Desk(boolean flag, int count) {
        
        this.flag = flag;
        this.count = count;
    }

    @Override
    public String toString() {
        return "Desk [flag=" + flag + ", count=" + count + ", lock=" + lock
                + "]";
    }

    public boolean isFlag() {
        return flag;
    }

    public void setFlag(boolean flag) {
        this.flag = flag;
    }

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }

    public Object getLock() {
        return lock;
    }
    
    

 

package thredDemo14;

public class Demo {
    
    // 生产者步骤:
    //  1 判断桌子上是否有汉堡包
    //  如果有就等待,如果没有才生产
    // 2 把汉堡包放在桌子上。
    // 3 叫醒等待待的消费者开吃。
    
    // 消费者
    // 1 判断桌上是否有汉堡包
    // 2  如果没有就等待
    // 3  如果有就开吃
    // 4  吃完后,桌子上的汉堡包就没有了,叫醒等待的生产者继续生产
    // 汉堡包的总数减去一
      public static void main(String[] args){
          
          Desk desk = new Desk();

          Foodie f = new Foodie(desk);
          Cooker c = new Cooker(desk);
          
          f.start();
          c.start();
      }
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值