多线程之生产者消费者问题
发布日期:2022-04-11 08:52:47
浏览次数:5
分类:博客文章
本文共 2681 字,大约阅读时间需要 8 分钟。
生产者消费者问题介绍
生产者消费者问题是一个经典的多线程同步问题。该问题描述了两个进程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是不断的生成数据,而与此同时,消费者则不断消耗这些数据。该问题的关键就是要保证当生产者生产了产品后,若消费者还没有消费此产品,则生产者停止生产并等待,直到消费者消费了此产品;当消费者消费了产品后,若生产者还没有及时生产新的产品,则消费者停止消费并等待,直到生产者生产了新产品。
存在的问题
- 当生产者比消费者快时,消费者会漏掉一部分数据
- 当消费者比生产者快时,消费者会取走重复的数据
使用 wait() 和 notify() 方法
wait():当缓冲区已满 / 空时,生产者或消费者线程停止自己的执行,释放锁,使自己处于等待状态,让其它线程执行。
notify():当生产者或消费者向缓冲区放入或取出一个产品时,向其他等待的线程发出通知,同时释放锁,使自己处于等待状态,让其它线程执行。
1 public class Demo04_生成者消费者 { 2 3 public static void main(String[] args) { 4 new Producer().start(); 5 new Consumer().start(); 6 } 7 8 private static Listhamburgers = new ArrayList (); 9 10 private static class Producer extends Thread{ //生产者11 12 int i=0;13 14 public void run() {15 16 while(true){17 if(hamburgers.size()<10){18 hamburgers.add(i); // 生产19 System.out.println("生产汉堡: "+i);20 i++;21 22 synchronized (hamburgers) {23 hamburgers.notifyAll();24 }25 26 }else{27 synchronized (hamburgers) {28 try {29 hamburgers.wait();30 } catch (InterruptedException e) {31 e.printStackTrace();32 }33 }34 35 }36 37 try {38 Thread.sleep(200);39 } catch (InterruptedException e) {40 e.printStackTrace();41 }42 }43 }44 }45 46 private static class Consumer extends Thread{//消费者47 public void run() {48 while(true){49 if(hamburgers.size()>0){50 System.out.println("消费汉堡: "+hamburgers.remove(0)); // 消费51 52 synchronized (hamburgers) {53 hamburgers.notifyAll();54 }55 56 }else{57 synchronized (hamburgers) {58 59 try {60 hamburgers.wait();61 } catch (InterruptedException e) {62 // TODO Auto-generated catch block63 e.printStackTrace();64 }65 }66 }67 68 try {69 Thread.sleep(200);70 } catch (InterruptedException e) {71 e.printStackTrace();72 }73 }74 }75 }76 }
转载地址:https://www.cnblogs.com/MMarshall/p/15987598.html 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
逛到本站,mark一下
[***.202.152.39]2024年04月17日 01时16分48秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
图文+代码带你攻克OAuth 2.0三大核心授权类型
2019-04-27
@Value注解不能注入static修饰的属性
2019-04-27
spring boot 2.x 接口返回时间类型不再自动序列化为timestamp
2019-04-27
Ubuntu Linux 创建root用户并且允许远程登录
2019-04-27
Linux shell 关于 2>&1 的含义
2019-04-27
Ubuntu Linux系统使用apt-get install安装的软件的相关位置
2019-04-27
nginx同一server配置多个前端工程location访问404问题
2019-04-27
前端嫌弃原生Swagger界面太low,于是我给她开通了超级VIP
2019-04-27
小白都能学会的Java注解与反射机制
2019-04-27
Java高并发测试框架JCStress
2019-04-27
阿里P8大神教我yaml语法,我终于不再只是使用字符串类型了
2019-04-27
Springboot 集成 i8n,两行代码实现国际化,你不想学吗?
2019-04-27
LeetCode 每日一题「判定字符是否唯一」
2019-04-27
Oracle中wm_concat的使用
2019-04-27
国庆第四天出行归来
2019-04-27
宝宝游乐园的优化思路(r6笔记第72天)
2019-04-27
UI5_INFO_FETCH_FROM_DB
2019-04-27
SAP CRM WebClient UI的配置存储数据库表
2019-04-27
SAP C4C Mashup port bindingF4帮助对话框里的数据源
2019-04-27