栈----生产者消费者实例

实际是线程的应用:
其相当于一个工厂**,工厂生产,然后存储到仓库,然后有消费者从仓库取出。
这次我使用的仓库是栈,然后消费者,生产者分别是一个对象,然后产品是一个对象,见下图
1.产品对象不重要,就是个实体类,

package threaddemo;public class Goods {private String name;private double price;public String getName() {return name;}public void setName(String name) {this.name = name;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}public Goods(String name, double price) {this.name = name;this.price = price;}@Overridepublic String toString() {return "Goods{" +"name='" + name + '\'' +", price=" + price +'}';}
}

2.重点在仓库

package threaddemo;public class MyStack {private Goods[] goodsStack;   //存储数组private int index;            //栈顶指针private int stackCount;       //栈的容量public MyStack(int stackCount) {     //初始化栈this.stackCount = stackCount;   //成员变量和局部变量不同if(this.stackCount<=0){this.stackCount=10;}goodsStack = new Goods[this.stackCount];index = 0;}public synchronized void push(Goods goods){   //同步锁if(index>=stackCount){  //判断是否满了try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}goodsStack[index]=goods;index++;System.out.println("生产了一个产品");this.notifyAll();  //唤醒多个线程}public synchronized Goods pop(){if(index<=0){   //判断是否为空try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}index--;Goods goods = goodsStack[index];goodsStack[index] =null;System.out.println("消费了一个产品");this.notifyAll(); //*********return goods;}
}

【注】
这里面注意:同步锁的应用:可以看看这个博主写的https://www.cnblogs.com/weibanggang/p/9470718.html

在我的代码中应用的我也简要总结一下:
我使用Synchronized是修饰的方法:一个线程访问一个对象中的synchronized(this)同步方法时,其他试图访问该对象的线程将被阻塞。

3.生产者消费者:

消费者

package threaddemo;public class ConsumerThread implements Runnable {  //继承接口和类都行,这个是接口,Thread还要继承该接口。但是不能使用start方法了private MyStack myStack;public ConsumerThread(MyStack myStack) {this.myStack = myStack;}public void run(){while (true){Goods goods = myStack.pop();  //消费之后线程休眠1stry {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}}
}

生产者

package threaddemo;public class ProducerThread extends Thread {//继承接口和类都行,这个是继承类Thread,但是Thread还要继承Runner接口private MyStack stack;public ProducerThread(MyStack stack) {this.stack = stack;}public void run(){while(true){Goods g = new Goods("薯条",14.5);stack.push(g);try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}}
}

【注】

1.上述方法继承接口和类都行,但Thread类还要继承Runnable接口。但是直接继承Runnable接口就不能直接使用start方法了
2. 如果仅仅是调用run方法的话,就相当于还是单线程,会顺序执行。但是在Test类实现Runnable接口之后Test类是没有start()方法的,只有run()方法。这时调用run方法也仅仅是调用一个普通方法,不会开启新线程。 我们此时就需要Thread类的start()方法来帮我们实现我们的多线程任务

4.测试方法

package threaddemo;public class Test {public static void main(String[] args) {  //记得写一个队列的MyStack stack = new MyStack(10);ProducerThread p = new ProducerThread(stack);p.start();//调用start使用多线程,而调用run不使用多线程new Thread( new ConsumerThread(stack)).start();/*如果仅仅是调用run方法的话,就相当于还是单线程,会顺序执行。但是在Test类实现Runnable接口之后,Test类是没有start()方法的,只有run()方法。这时调用run方法也仅仅是调用一个普通方法,不会开启新线程。我们此时就需要Thread类的start()方法来帮我们实现我们的多线程任务*/}
}

栈----生产者消费者实例相关推荐

  1. java kafka 集群消费_kafka集群简单生产者消费者实例

    项目描述 本项目是个简单的kafka集群简单生产者和消费者实例,生产者能生产消息,消费者能消费消息,这里将消费的消息存入了mysql数据库,适合刚kafka刚入门的朋友借鉴使用,里面的zookeepe ...

  2. java中synchronized同步锁实现生产者消费者模式

    synchronized介绍 一.基本概念 synchronized关键字是java里面用来在多线程环境下保证线程安全的同步锁:java里面有对象锁和类锁,对象锁是用在对象实例的方法上或者一个对象实例 ...

  3. java生产者消费者代码_Java实现Kafka生产者消费者代码实例

    Kafka的结构与RabbitMQ类似,消息生产者向Kafka服务器发送消息,Kafka接收消息后,再投递给消费者. 生产者的消费会被发送到Topic中,Topic中保存着各类数据,每一条数据都使用键 ...

  4. Java 线程实例二(终止线程、生产者/消费者问题、获取线程状态、获取所有线程、查看线程优先级、中断线程)

    终止线程 Java中原来在Thread中提供了stop()方法来终止线程,但这个方法是不安全的,所以一般不建议使用. 本文向大家介绍使用interrupt方法中断线程. 使用interrupt方法来终 ...

  5. python 全栈开发,Day39(进程同步控制(锁,信号量,事件),进程间通信(队列,生产者消费者模型))...

    昨日内容回顾 python中启动子进程 并发编程 并发 :多段程序看起来是同时运行的 ftp 网盘 不支持并发 socketserver 多进程 并发 异步 两个进程 分别做不同的事情 创建新进程 j ...

  6. 图文并茂的生产者消费者应用实例demo

    前面的几篇文章<<.NET 中的阻塞队列BlockingCollection的正确打开方式>><<项目开发中应用如何并发处理的一二事>>从代码以及理论角 ...

  7. java 线程同步的list_java线程生产者与消费者实例(使用List实现同步)

    过多的线程同步可能会造成死锁 死锁通俗来讲就是两个或者两个以上线程,占用了对方下一步所需要的资源,多个线程僵持都无法结束任务的状态 生产者和消费者模式是一个多线程同步的经典案例 它利用信号灯来判断线程 ...

  8. 生产者消费者代码_生产者消费者模型:Kotlin 多线程读写文件实例

    计算机科学中的所有问题,都可以通过添加一个间接层来解决. 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题. 生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产 ...

  9. 【全栈之路】JAVA基础课程四_生产者消费者问题(20190614v1.1)

    欢迎进入JAVA基础课程 博客地址:https://segmentfault.com/a/1190000019482921 本系列文章将主要针对JAVA一些基础知识点进行讲解,为平时归纳所总结,不管是 ...

最新文章

  1. Java PriorityQueue实现大顶堆
  2. python线下培训-济南Python线下培训班哪个好
  3. 使用electron-vue搭建桌面应用程序项目
  4. 工业互联网企业如何做,才能“赋能万物,连接未来”?
  5. 信息抽取新SOTA!首个结构化生成式信息抽取预训练模型,一统信息抽取四大任务...
  6. 文献学习(part71)--Graph Regularized Non-negative Matrix Factorization for Data Representation
  7. LeetCode695. 岛屿的最大面积(C#)
  8. C语言 · 芯片测试
  9. 【趣闻轶事】中奖252次?看“数学侦探”识破彩票猫腻
  10. oracle插入CLOB类型超过4000个字符报ORA-01704错的解决方法
  11. linux上php环境安装(包含svn的使用、php扩展安装)
  12. Windows服务器基本安全策略配置
  13. 基于 Spring Boot 的停车场管理系统
  14. ipad2利用crappstore安装破解软件成功-还是写一下我安装的过程吧,大家可以参考一下...
  15. 不选主元Gauss消去法
  16. STM32要按复位键才能下载问题解决
  17. HDU 1728 逃离迷宫(BFS的优化)
  18. 计算机组装维护看图填空,电脑组装测试维护故障排除
  19. 【渝粤题库】广东开放大学 管理学原理 形成性考核
  20. 京东商城导航logo---用css

热门文章

  1. 在Ubuntu 16.10 安装 git 并上传代码至 git.oschina.net
  2. ant扩展应用的安装
  3. 站点某些网页想显示母版页内的用户控件,某些网页不想显示,怎样实现
  4. (转) ASP.NET 2.0:使用用户控件和定制的Web部件个人化你的门户网站(二)
  5. CS231n 学习笔记(2)——神经网络 part2 :Softmax classifier
  6. 洛谷 P3805 manacher算法
  7. 《剑指offer》第十八题(在O(1)时间删除链表结点)
  8. 【Python问题解决】关于解决python3.x无法使用PIL库的解决方法
  9. 什么是同源策略及限制
  10. xtrabackup全量备份+binlog基于时间点恢复