/**生产者消费者问题,涉及到几个类

* 第一,这个问题本身就是一个类,即主类

* 第二,既然是生产者、消费者,那么生产者类和消费者类就是必须的

* 第三,生产什么,消费什么,所以物品类是必须的,这里是馒头类

* 第四,既然是线程,那么就不是一对一的,也就是说不是生产一个消费一个,既然这样,多生产的往哪里放,

*      现实中就是筐了,在计算机中也就是数据结构,筐在数据结构中最形象的就是栈了,因此还要一个栈类

*/

packagethread;

publicclassProduceConsume {

publicstaticvoidmain(String[] args) {

SyncStack ss = newSyncStack();//建造一个装馒头的框

Producer p = newProducer(ss);//新建一个生产者,使之持有框

Consume c = newConsume(ss);//新建一个消费者,使之持有同一个框

Thread tp = newThread(p);//新建一个生产者线程

Thread tc = newThread(c);//新建一个消费者线程

tp.start();//启动生产者线程

tc.start();//启动消费者线程

}

}

//馒头类

classSteamBread{

intid;//馒头编号

SteamBread(intid){

this.id = id;

}

publicString toString(){

return"steamBread:"+id;

}

}

//装馒头的框,栈结构

classSyncStack{

intindex =0;

SteamBread[] stb = newSteamBread[6];//构造馒头数组,相当于馒头筐,容量是6

//放入框中,相当于入栈

publicsynchronizedvoidpush(SteamBread sb){

while(index==stb.length){//筐满了,即栈满,

try{

this.wait();//让当前线程等待

} catch(InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

this.notify();//唤醒在此对象监视器上等待的单个线程,即消费者线程

stb[index] = sb;

this.index++;

}

//从框中拿出,相当于出栈

publicsynchronizedSteamBread pop(){

while(index==0){//筐空了,即栈空

try{

this.wait();

} catch(InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

this.notify();

this.index--;//push第n个之后,this.index++,使栈顶为n+1,故return之前要减一

returnstb[index];

}

}

//生产者类,实现了Runnable接口,以便于构造生产者线程

classProducerimplementsRunnable{

SyncStack ss = null;

Producer(SyncStack ss){

this.ss = ss;

}

@Override

publicvoidrun() {

// 开始生产馒头

for(inti=0;i<20;i++){

SteamBread stb = newSteamBread(i);

ss.push(stb);

System.out.println("生产了"+stb);

try{

Thread.sleep(10);//每生产一个馒头,睡觉10毫秒

} catch(InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

//消费者类,实现了Runnable接口,以便于构造消费者线程

classConsumeimplementsRunnable{

SyncStack ss = null;

publicConsume(SyncStack ss) {

super();

this.ss = ss;

}

@Override

publicvoidrun() {

// TODO Auto-generated method stub

for(inti=0;i<20;i++){//开始消费馒头

SteamBread stb = ss.pop();

System.out.println("消费了"+stb);

try{

Thread.sleep(100);//每消费一个馒头,睡觉100毫秒。即生产多个,消费一个

} catch(InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

运行结果:

java多线程 生产者消费者_java多线程之生产者消费者经典问题 - 很不错的范例相关推荐

  1. java 生产者消费者_Java多线程:线程间通信—生产者消费者模型

    一.背景 && 定义 多线程环境下,只要有并发问题,就要保证数据的安全性,一般指的是通过 synchronized 来进行同步. 另一个问题是, 多个线程之间如何协作呢 ? 我们看一个 ...

  2. java消费者和生产者模型_Java实现简易生产者消费者模型过程解析

    一.概述 一共两个线程,一个线程生产产品,一个线程消费产品,使用同步代码块方法,同步两个线程.当产品没有时,通知生产者生产,生产者生产后,通知消费者消费,并等待消费者消费完. 需要注意的是,有可能出现 ...

  3. java 锁旗标_Java多线程

    Java多线程 1. 多线程存在的意义 多线程最大的作用就是能够创建"灵活响应"的桌面程序,而编写多线程最大的困难就是不同线程之间共享资源的问题,要使这些资源不会同时被多个线程访问 ...

  4. java 管程通信_Java多线程07_线程通信之管程法与信号灯法

    Java多线程07_线程通信之管程法与信号灯法 线程通信 的应用场景是 消费者/生产者问题: 解决线程通信的方法: wait()表示线程一直等待,直到接到通知(会释放锁) wait(long time ...

  5. java线程集合点_Java多线程学习笔记(三) 甚欢篇

    使人有乍交之欢,不若使其无久处之厌 <小窗幽记>很多时候,我们需要的都不是再多一个线程,我们需要的线程是许多个,我们需要让他们配合.同时我们还有一个愿望就是复用线程,就是将线程当做一个工人 ...

  6. java线程代码实现_Java 多线程代码实现讲解

    作为一个完全面向对象的语言,Java提供了类 java.lang.Thread 来方便多线程编程,这个类提供了大量的方法来方便我们控制自己的各个线程.那么如何提供给 Java 我们要线程执行的代码呢? ...

  7. java线程怎么用_Java多线程基本使用

    一.概念 1.进程 1.1进程:是一个正在进行中的程序,每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元. 1.2线程:就是进程中一个独立的控制单元,线程在控制着进程的执行,一 ...

  8. java多线程 生产者消费者_java多线程之-生产者与消费者

    java多线程之-并发协作[生产者与消费者]模型 对于多线程程序来说,不管c/c++ java python 等任何编程语言,生产者与消费者模型都是最为经典的.也就是可以说多线程的并发协作 对于此模型 ...

  9. java消费者生产者设计模式_java 多线程并发设计模式之四: 生产者消费者模式

    生产者消费者模式是一个经典的多线程设计模式,其核心思想是:有两类线程和一个内存缓冲区或者队列, 一类线程发起任务,并提交到队列中.另一类线程用来处理这些任务,叫做消费者线程. 这两类线程进行通信的桥梁 ...

最新文章

  1. 避免35岁现象,我给技术人的建议永远是架构师!
  2. python matplotlib绘制折线图
  3. 实验进行中:.NET WebAssembly支持
  4. UA SIE545 优化理论基础 例题 对偶函数的凸性与次梯度计算
  5. 改善DataGrid的默認分頁使其更友好
  6. java jar包 平滑重启,nginx 平滑重启的实现方法
  7. 过山车(HDU-2063)
  8. 资源下载| 机器学习经典书籍《统计学习方法》(Python3.6)代码实现(及课件)
  9. mysql群集配置_MySQL主主集群配置
  10. oracle复杂分组查询语句,oracle中的“复杂”分组统计sql
  11. iPhone11用第三方的快充,电池健康度会下降很快吗?
  12. Java线程的5种状态及切换(透彻讲解)
  13. c语言打印字符数据在屏幕上,在屏幕上输出各种类型的数据
  14. c语言添加vmp保护代码,易语言使用vmp加壳保护程序
  15. 关于VGA的分辨率。。。。图解
  16. 1.1 半导体基础知识
  17. 局域网搭建git服务器
  18. 使用python调用百度翻译api进行翻译
  19. 芯片到uboot启动流程 :ROM → MLO(SPL)→ uboot.img
  20. python快速实现简单的图像人脸融合

热门文章

  1. HDU_5249(百度之星D题)
  2. PHP vs Node.js vs Nginx-Lua(转)
  3. mono for android 使用Tab 控件
  4. 通过编程计算一个游戏的胜率
  5. 一个关于winform多线程的教程(pdf)
  6. mixin network_基于Mixin Network的Go语言比特币开发教程 : 用 Mixin Messenger 机器人接受和发送比特币...
  7. jmeter压测_简单七步,快速入门 JMeter原生压测
  8. window10使用 Hyper-V 创建ubuntu虚拟机并使用增强会话功能
  9. 按钮是什么意思_汽车里的Rear按键是什么意思?
  10. Android与Js交互时,屏幕不适配问题