这博客是对自己学习的一点点总结及记录,如果您对 Java、算法 感兴趣,可以关注我的动态,我们一起学习。
用知识改变命运,让我们的家人过上更好的生活
。
目录
-
-
- 一、生产者和消费者模式描述
-
-
二、存在的问题
-
三、wait()和notify()方法
-
四、生产者和消费者模式中涉及到的类
-
五、代码实现
一、生产者和消费者模式描述
生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者从空间里取走数据。
二、存在的问题
-
当生产者比消费者快时,消费者会漏掉一部分数据;
-
当消费者比生产者快时,消费者会取走相同的数据。
解决方式:要考虑线程安全的问题,解决此问题有三种方式
① 同步代码块
② 同步方法
③ lock锁机制, 通过创建Lock对象,采用lock()加锁,unlock()解锁,来保护指定的代码块
此博客采用第二种方式解决了线程安全问题
三、wait()和notify()方法
wait()
、nofity()
这两个方法必须有锁对象调用,而任意对象都可以作为 synchronized 的同步锁,因此这三个方法只能在Object 类中声明 。
-
wait():当缓冲区已满/空时,生产者或消费者线程停止自己的执行,释放锁,使自己处于等待状态,让其它线程执行。
-
notify():当生产者或消费者向缓冲区放入或取出一个产品时,向其他等待的线程发出通知,同时释放锁,使自己处于等待状态,让其它线程执行。
四、生产者和消费者模式中涉及到的类
- 商店类(Shop):定义一个成员变量,表示第几个面包,提供生产面包和消费面包的操作;
- 生产者类(Producer):实现Runnable接口,重写run()方法,调用生产面包的操作;
- 消费者类(Consumer):实现Runnable接口,重写run()方法,调用消费面包的操作;
- 测试类:
五、代码实现
/**
- 商店类(Shop):定义一个成员变量,表示第几个面包,提供生产面包和消费面包的操作;
*/
class Shop {
private int bread = 0;
/**
- 生产面包
*/
public synchronized void produceBread() {
if (bread < 10) {
bread++;
System.out.println(Thread.currentThread().getName() + “:开始生产第” + bread + “个面包”);
notify(); // 唤醒消费者线程
} else {
try {
wait(); // 告诉生产者等待一下
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/**
- 消费面包
*/
public synchronized void consumeBread() {
if (bread > 0) {
System.out.println(Thread.currentThread().getName() + “:开始消费第” + bread + “个面包”);
bread–;
notify(); // 唤醒生产者线程
} else {
try {
wait(); // 告诉消费者等待一下
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
/**
- 生产者类(Producer):继承Thread类,重写run()方法,调用生产面包的操作
*/
class Producer extends Thread {
private Shop shop;
public Producer(Shop shop) {
this.shop = shop;
}
@Override
public void run() {
System.out.println(getName() + “:开始生产面包…”);
while (true) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
shop.produceBread();
}
}
}
/**
- 消费者类(Consumer):继承Thread类,重写run()方法,调用消费面包的操作
*/
class Consumer extends Thread {
private Shop shop;
public Consumer(Shop shop) {
this.shop = shop;
}
@Override
public void run() {
System.out.println(getName() + “:开始消费面包…”);
while (true) {
try {
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!