使用wait()方法和notify()方法实现“生产者和消费者模式“

前言

  • 1.使用wait()方法和notify()方法实现"生产者和消费者模式"

  • 2.什么是"生产者模式和消费者模式"?
    生产线程负责生产,消费线程负责消费
    生产线程和消费线程要达到均衡
    这是一种特殊的业务需求,在这种特殊的情况下需要使用wait()和notify()方法

  • 3.wait方法和notify方法建立在线程同步的基础之上。因为多线程要同时操作一个仓库。有线程安全问题

  • 4.wait方法的作用:o.wait()让正在o对象上活动的线程t进入等待状态,并且释放t线程之前占有的o对象的锁

  • 5.notify()方法作用:o.notify()让正在o对象上等待的线程唤醒,只是通知,不会释放o对象上之前占有的锁

  • 6.模拟这样一个需求:
    仓库我们采用List集合
    List集合中假设只能存储1个元素
    1个元素就表示仓库满了
    如果List集合中元素个数是0,就表示仓库空了
    保证List集合中永远都是最多存储一个元素

public class ThreadTest16 {
	public static void main(String[] args) {
		// 首先创建一个共享的仓库
		List list = new ArrayList();
		// 创建两个线程对象
		// 生产者线程
		Thread t1 = new Thread(new Producer(list));
		// 消费者线程
		Thread t2 = new Thread(new Consumer(list));
		t1.setName("生产者线程");
		t2.setName("消费者线程");
		t1.start();
		t2.start();
	}

}

//生产线程
class Producer implements Runnable {
	private List list;

	public Producer(List list) {
		this.list = list;
	}

	@Override
	public void run() {
		// 一直生产(使用死循环来模拟一直生产)
		while (true) {
			// 给仓库对象list加锁
			synchronized (list) {
				if (list.size() > 0) {// list集合元素个数大于零,说明仓库已经满了
					// 当前线程进入等待状态,并且释放Producer之前占有的list集合的锁
					try {
						list.wait();
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
				// 程序能够执行到这里说明仓库是没有元素的,进行生产
				Object obj = new Object();
				list.add(obj);
				System.out.println(Thread.currentThread().getName() + "----->" + obj);
				// 唤醒消费者
				list.notify();
			}

		}

	}

}

//消费线程
class Consumer implements Runnable {
	private List list;

	public Consumer(List list) {
		this.list = list;
	}

	@Override
	public void run() {
		while (true) {
			synchronized (list) {
				if (list.size() == 0) {// list集合元素的等于零,说明仓库是空的
					try {
						list.wait();
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
				// 程序能够执行到这里说明仓库是有元素的,进行消费
				Object obj = list.remove(0);
				System.out.println(Thread.currentThread().getName() + "----->" + obj);
				// 唤醒生产者
				list.notify();
			}
		}

	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的使用wait()和notify()实现生产者-消费者模型: ``` java public class ProducerConsumer { private List<Integer> buffer = new ArrayList<>(); private int maxSize = 5; public synchronized void produce() throws InterruptedException { while (buffer.size() == maxSize) { wait(); } int item = new Random().nextInt(); buffer.add(item); System.out.println("Produced: " + item); notify(); } public synchronized void consume() throws InterruptedException { while (buffer.size() == 0) { wait(); } int item = buffer.remove(0); System.out.println("Consumed: " + item); notify(); } } ``` 在上述代码中,`buffer`是一个用来存储生产者生产的数据的缓冲区,`maxSize`是缓冲区的最大大小,`produce()`和`consume()`分别表示生产者消费者的行为。在`produce()`和`consume()`方法中,使用了`wait()`和`notify()`方法实现线程的等待和唤醒。 在生产者线程中,如果缓冲区已满,就让线程等待(调用`wait()`方法)。如果缓冲区不满,就生产一个随机数,并且将其加入缓冲区中,然后唤醒等待的消费者线程(调用`notify()`方法)。 在消费者线程中,如果缓冲区为空,就让线程等待(调用`wait()`方法)。如果缓冲区不为空,就从缓冲区中取出一个数据,并且将其打印出来,然后唤醒等待的生产者线程(调用`notify()`方法)。 注意,以上代码仅作为示例,是一个比较简单的实现。在实际生产环境中,可能需要更加完善的实现方式来保证线程安全和性能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值