package com.cn.test3;

//java多线程模拟生产者消费者问题
//ProducerConsumer是主类,Producer生产者,Consumer消费者,Product产品
//Storage仓库
//批注:我把输出结果写在程序以下了,你能够看一下,事实上非常easy的,你想象一下产品从生产,到取出的一个生产线,我们定义两个线程,生产者线程,和消费者线程,一个是生产者不停的生产产品并放入数量有限的指定槽内,而消费者从指定槽依次取出产品,现实中的流水车间也相似于此。
public class test3 {

	public static void main(String[] args) {
Storage s = new Storage();
Producer p = new Producer(s);
Consumer c = new Consumer(s);
Thread tp = new Thread(p);
Thread tc = new Thread(c);
tp.start();
tc.start();
}
}
class Consumer implements Runnable {//消费者
Storage s = null;
public Consumer(Storage s){
this.s = s;
}
public void run() {
for(int i=0; i<10; i++){//这里的10指的是10个产品,依据生产者生产的产品数量一致,生产者生产10个产品,消费者肯定仅仅能取出10个产品。
Product p = s.pop();//取出产品
try {
Thread.sleep((int)(Math.random()*1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
} } } class Producer implements Runnable {//生产者
Storage s = null; public Producer(Storage s){
this.s = s;
} public void run() {
//总共生产10个产品
for(int i=0; i<10; i++){//这里的10能够任意改动,看你想让生产者生产多少产品了,我们如今假定生产10个产品就停止,能够參考程序的 输出。
Product p = new Product(i);
s.push(p); //放入产品
// System.out.println("生产者放入:" + p);
try {
Thread.sleep((int)(Math.random()*1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
} }
} class Product {
int id; public Product(int id){
this.id = id;
} public String toString(){//重写toString方法
return "产品:"+this.id;
}
} class Storage {
int index = 0;
//仓库存储量最大也仅仅有三个位置。//这个就是指生产者把产品生产出来,放入到指定“槽”内,我们如今假定,槽仅仅有3个槽,当然你能够设定多个,当生产者
//把产品都占满了3个槽的情况时,那仅仅能等消费者取出一个槽内的产品才干继续生产产品以放到槽内。。能够理解吧。。
Product[] products = new Product[3]; synchronized public void push(Product p){//放入,放入和取出代码是要加锁的,这个能够理解吧。。这段代码要么不运行,要么运行完。。。
while(index==this.products.length){
try {
this.wait();
} catch (Exception e) {
e.printStackTrace();
}
}
this.products[index] = p;
System.out.println("生产者放入"+index+"位置:" + p);
index++;
this.notifyAll();
} public synchronized Product pop(){//取出
while(this.index==0){
try {
this.wait();
} catch (Exception e) {
e.printStackTrace();
}
}
index--;
this.notifyAll();
System.out.println("消费者从"+ index+ "位置取出:" + this.products[index]);
return this.products[index];
}
}

输出结果:
生产者放入0位置:产品:0
消费者从0位置取出:产品:0
生产者放入0位置:产品:1
消费者从0位置取出:产品:1
生产者放入0位置:产品:2
生产者放入1位置:产品:3
消费者从1位置取出:产品:3
生产者放入1位置:产品:4
消费者从1位置取出:产品:4
消费者从0位置取出:产品:2
生产者放入0位置:产品:5
消费者从0位置取出:产品:5
生产者放入0位置:产品:6
消费者从0位置取出:产品:6
生产者放入0位置:产品:7
生产者放入1位置:产品:8
消费者从1位置取出:产品:8
生产者放入1位置:产品:9
消费者从1位置取出:产品:9
消费者从0位置取出:产品:7

java多线程模拟生产者消费者问题,公司面试常常问的题。。。的更多相关文章

  1. java多线程解决生产者消费者问题

    import java.util.ArrayList; import java.util.List; /** * Created by ccc on 16-4-27. */ public class ...

  2. JAVA多线程之生产者 消费者模式 妈妈做面包案例

    创建四个类 1.面包类 锅里只可以放10个面包 ---装面包的容器2.厨房 kitchen 生产面包 和消费面包  最多生产100个面包3.生产者4消费者5.测试类 多线程经典案例 import ja ...

  3. Java多线程_生产者消费者模式2

    在我的上一条博客中,已经介绍到了多线程的经典案列——生产者消费者模式,但是在上篇中用的是传统的麻烦的非阻塞队列实现的.在这篇博客中我将介绍另一种方式就是:用阻塞队列完成生产者消费者模式,可以使用多种阻 ...

  4. Java多线程实现生产者消费者延伸问题

    在操作系统中有一类问题被称为生产者消费者问题:意为,有数个生产者生产产品,有数个消费者消费产品,他们共享一定数量的缓存. 这里用java多线程编程,实现生产者消费者问题的一种延伸,橘子苹果问题. 题目 ...

  5. Java多线程-----实现生产者消费者模式的几种方式

       1 生产者消费者模式概述 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题.生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理 ...

  6. 【多线程】java多线程实现生产者消费者模式

    思考问题: 1.为什么用wait()+notify()实现生产者消费者模式? wait()方法可以暂停线程,并释放对象锁 notify()方法可以唤醒需要该对象锁的其他线程,并在执行完后续步骤,到了s ...

  7. Java多线程之生产者消费者问题&lt;一&gt;:使用synchronized keyword解决生产者消费者问题

    今天看了一片博文,讲Java多线程之线程的协作,当中作者用程序实例说明了生产者和消费者问题,但我及其它读者发现程序多跑几次还是会出现死锁,百度搜了下大都数的样例也都存在bug,经过细致研究发现当中的问 ...

  8. Java多线程_生产者消费者模式1

    生产者消费者模型       具体来讲,就是在一个系统中,存在生产者和消费者两种角色,他们通过内存缓冲区进行通信,生产者生产消费者需要的资料,消费者把资料做成产品.生产消费者模式如下图.(图片来自网络 ...

  9. Java多线程同步——生产者消费者问题

    这是马士兵老师的Java视频教程里的一个生产者消费者问题的模型 public class ProduceConsumer{ public static void main(String[] args) ...

随机推荐

  1. 安装GDB和GDBSERVER

    安装GDB和GDBSERVER 转自http://www.360doc.com/content/10/0407/17/155970_21971613.shtml 把GDBSERVER装入文件系统 转自 ...

  2. 问题:CListCtrl如何高亮选中一行 http://zhidao.baidu.com/question/100664911.html 扩展:单行、双行及完成状态的字体等等。。。

    http://zhidao.baidu.com/link?url=BKp05mfOdKbEBh21svQelpVhYjzDkIpYUZay8_3ZLSndTQn5kK0eTwQG8jBvYnwh8US ...

  3. 如何搭建自己CDN服务器

    转载:http://server.zzidc.com/fwqpz/587.html 目前在免费CDN市场上,360因为“免费”而越做越大,加速乐做的很早.但因免费的节点不多,好多用户都被强走了.安全宝 ...

  4. [D3] Convert Dates to Numeric Values with Time Scales in D3 v4

    Mapping abstract values to visual representations is what data visualization is all about, and that’ ...

  5. 嵌入式linux串口编程(二)

    /*com_writer.c*/#include "uart_api.h" int main(void){ int fd; char buff[BUFFER_SIZE]; if(( ...

  6. hadoop2.7全然分布式集群搭建以及任务測试

    要想深入的学习hadoop数据分析技术,首要的任务是必需要将hadoop集群环境搭建起来,本文主要讲述怎样搭建一套hadoop全然分布式集群环境. 环境配置:2台64位的redhat6.5 +  1台 ...

  7. Django之文章归档

    1.任务描述:将博文按照时间月份归档 2.源代码: views.py def getPage(request, article_list): paginator = Paginator(article ...

  8. Thinking in UML 学习笔记(二)——UML核心视图之用例图

    在UML中,需求模型又称为用例模型,它主要用于描述系统的功能性需求,即软件可以实现的功能,如登录.注册.入库.出库.查看库存报表.增加员工信息等.常规的用例建模一般包括两个组成部分:绘制用例图和编写用 ...

  9. js获取浏览器尺寸

    Javascript: alert(document.body.clientWidth);        //网页可见区域宽(body) alert(document.body.clientHeigh ...

  10. 华为上机试题(java)

    一.题目描述:通过键盘输入一串小写字母(a~z)组成的字符串.请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉.比如字符串“abacacde”过滤结果为“abcde”. ...