生产者消费者模式(wait/notify)

一生产者和一消费者

MyTack类

public class MyTack {
  private List list =new ArrayList();

  private Object lock;

  public MyTack(Object lock) {
    this.lock = lock;
  }

  public void push() {
    try {
      synchronized (lock) {
        if (list.size() == 1) {
          lock.wait();
        }
        lock.notify();
        list.add(Math.random());
        System.out.println("push="+list.size()+"==="+list.get(0));
      }
    } catch (Exception e){
      e.printStackTrace();
    }
  }

  public void pop() {
    try {
      synchronized (lock) {
        if (list.size() == 0) {
          lock.wait();
        }
        lock.notify();
        System.out.println("pop="+list.size()+"====="+list.remove(0));
      }
    } catch (Exception e){
      e.printStackTrace();
    }
  }
}

生产者线程

public class Producer extends Thread{
  private MyTack myTack;

  public Producer(MyTack myTack) {
    this.myTack = myTack;
  }

  @Override
  public void run() {
    while (true){
      myTack.push();
    }
  }
}

消费者

public class Consumer extends Thread{
  private MyTack myTack;

  public Consumer(MyTack myTack) {
    this.myTack = myTack;
  }

  @Override
  public void run() {
    while (true) {
      myTack.pop();
    }
  }
}

测试类

public class RunTest {
  public static void main(String[] args) {
    final Object o=new Object();
    MyTack myTack = new MyTack(o);

    Thread producer=new Producer(myTack);
    Thread consumer=new Consumer(myTack);

    producer.start();
    consumer.start();
  }
}

数组里面只能存在一个元素。
在这里插入图片描述

一生产者和多消费者

测试类

public class RunTest {
  public static void main(String[] args) {
    final Object o=new Object();
    MyTack myTack = new MyTack(o);

    Thread producer=new Producer(myTack);
    Thread consumer=new Consumer(myTack);
    Thread consumer2=new Consumer(myTack);
    Thread consumer3=new Consumer(myTack);

    producer.start();
    consumer.start();
    consumer2.start();
    consumer3.start();
  }
}

在这里插入图片描述

原因:多个wait状态的线程被唤醒,导致remove时报错
将上面临界区中if条件改为while判断,则每次唤醒之后,会重新判断一次条件是否满足。运行正常,但是会出现假死的状态,将notify改为notifyall
修正代码

public class MyTack {
  private List list =new ArrayList();

  private Object lock;

  public MyTack(Object lock) {
    this.lock = lock;
  }

  public void push() {
    try {
      synchronized (lock) {
        while (list.size() == 1) {
          lock.wait();
        }
        lock.notifyAll();
        list.add(Math.random());
        System.out.println("push="+list.size()+"==="+list.get(0));
      }
    } catch (Exception e){
      e.printStackTrace();
    }
  }

  public void pop() {
    try {
      synchronized (lock) {
        while (list.size() == 0) {
          lock.wait();
        }
        lock.notifyAll();
        System.out.println("pop="+list.size()+"====="+list.remove(0));
      }
    } catch (Exception e){
      e.printStackTrace();
    }
  }
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值