/*
线程同步之生产者-消费者模型
该模型符合以下要求:
1、生产者只在仓储未满时生产,仓满则停止生产;
2、消费者只在仓储未空时消费,仓空则等待;
3、当消费者发现仓储为空时则通知生产者生产;
4、生产者在生产出可消费产品时则通知消费者来消费;
*/

 1 package one;
 2 class Go{
 3     public static final int MAX_NUM=100;//最大库存量
 4     private int currennum;//当前库存
 5     Go(){}
 6     Go(int currennum){
 7         this.currennum=currennum;
 8     }
 9     public synchronized void produce(int neednum){
10         System.out.println("要生产的产品数量"+neednum+"与现有仓储靓之和大于最大仓储量"+MAX_NUM+",所以不能生产!!");
11         while(currennum+neednum>MAX_NUM){
12             try {
13                 this.wait();//使当前线程阻塞,并释放锁
14             } catch (InterruptedException e) {
15                 // TODO Auto-generated catch block
16                 e.printStackTrace();
17             }
18         }
19         currennum+=neednum;
20         System.out.println("已经生产了"+neednum+",现在仓储量为:"+currennum);
21         this.notifyAll();//不释放锁,也不获得锁,仅通知其他线程可以竞争执行
22     }
23     public synchronized void consum(int neednum){
24         while(currennum<neednum){
25             System.out.println("现有仓储量不足,无法消费!!");
26             try {
27                 this.wait();
28             } catch (InterruptedException e) {
29                 // TODO Auto-generated catch block
30                 e.printStackTrace();
31             }
32         }
33         currennum-=neednum;
34         System.out.println("已经消费了"+neednum+",现在仓储量为:"+currennum);
35         this.notifyAll();
36     }
37 }
38 class Producer extends Thread{
39     private int neednum;
40     private Go go;
41     Producer(int neednum,Go go){
42         this.neednum=neednum;
43         this.go=go;
44     }
45     public void run(){
46         go.produce(neednum);
47     }
48 }
49 class Consumer extends Thread{
50     private int neednum;
51     private Go go;
52     Consumer(int neednum,Go go){
53         this.neednum=neednum;
54         this.go=go;
55     }
56     public void run(){
57         go.consum(neednum);
58     }
59 }
60 public class Practice extends Thread{
61     public static void main(String[] args){
62         Go go=new Go(30);
63         new Consumer(50,go).start();
64         new Consumer(20,go).start();
65         new Consumer(30,go).start();
66         new Producer(10,go).start();
67         new Producer(10,go).start();
68         new Producer(10,go).start();
69         new Producer(10,go).start();
70         new Producer(10,go).start();
71         new Producer(80,go).start();
72 }
73 }

摘自:http://blog.csdn.net/kutekute/article/details/8071421

转载于:https://www.cnblogs.com/XL-Liang/archive/2013/04/09/3009451.html

线程同步之经典生产者-消费者模型相关推荐

  1. linux使用线程实现生产者消费者问题,Linux平台下线程同步,实现“生产者消费者问题”...

    (1)线程同步,实现"生产者消费者问题" 要求:缓冲区大小为20,生产者每次放一个产品,消费者每次取走一个产品:生产者和消费者至少2个. (2)代码如下: #include #in ...

  2. 【Java 并发编程】多线程、线程同步、死锁、线程间通信(生产者消费者模型)、可重入锁、线程池

    并发编程(Concurrent Programming) 进程(Process).线程(Thread).线程的串行 多线程 多线程的原理 多线程的优缺点 Java并发编程 默认线程 开启新线程 `Ru ...

  3. Python之进程+线程+协程(生产者消费者模型)

    本篇主要总结一下非常有名的生成者消费者模型 概念引用 1.为什么要使用生产者和消费者模型? 在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程.在多线程开发当中,如果生产者处理速度很快, ...

  4. 生产者消费者代码c语言_由生产者消费者模型引出的线程同步问题

    由生产者消费者模型引出的线程同步问题 基本生产者消费者模型: 代码示例: 数据模型: /*** Created by IntelliJ IDEA.** @Author: ZhangDong* @Dat ...

  5. 线程同步 生产者消费者 java_Java线程同步:生产者-消费者 模型(代码示例)

    public class ThreadSyn { public static void main(String[] args) { new ThreadSyn(); } public ThreadSy ...

  6. C语言使用信号量解决生产者消费者模型的同步问题

    友链 gcc 1.c -o 1 -lpthread // ..使用内存映射可以拷贝文件 /* 对原始文件进行内存映射 创建一个新文件 把新文件的数据拷贝映射到内存中 通过内存拷贝将第一个文件的内存映射 ...

  7. C语言 生产者消费者模型

    友链 互斥量mutex 条件变量cond gcc 1.c -o 1 -lpthread // ..使用内存映射可以拷贝文件 /* 对原始文件进行内存映射 创建一个新文件 把新文件的数据拷贝映射到内存中 ...

  8. 操作系统 —— 生产者消费者模型

    文章目录 1. 生产者消费者模型的理解 1.1 串行的概念 1.2 并行的概念 1.3 简单总结: 2. 基于阻塞队列(block queue)实现此模型 2.1 阻塞队列的实现 2.2 使用阻塞队列 ...

  9. < Linux > 多线程(生产者消费者模型)

    目录 1.生产者消费者模型 生产者消费者模型的例子 生产者消费者模型的特点 生产者消费者模型的优点 2.基于BlockingQueue的生产者消费者模型 概念 模拟实现基于阻塞队列的生产消费模型 基于 ...

最新文章

  1. server sql 分组 去重 字符串拼接_SQL | 数据分析面试必备SQL语句+语法
  2. 你需要知道的缓存击穿/穿透/雪崩
  3. matlab在绘图区加格栅,实验二(2) MATLAB绘图
  4. 数据结构源码笔记(C语言描述)汇总
  5. java 登录牵手_Java: HttpURLConnection 模拟登录方法 (带cookie 的Post/Get)_20160908_七侠镇莫尛貝...
  6. POJ 1195 Mobile phones(裸的二维树状数组)
  7. 第一次训练赛的相关总结和教训!
  8. react直接使用bootstrap失效的原因
  9. 用RtlAdjustPrivilege来调整进程权限(VB6.0代码)
  10. or1200处理器的异常处理类指令介绍
  11. “10亿元身价”CEO的6个密码
  12. 一些关于java的笔记
  13. 亚像素边缘提取方法总结
  14. 04 _ 可扩展架构案例(一):电商平台架构是如何演变的?
  15. little-endian java_Little-Endian的JAVA
  16. 郑州共享美容院小程序开发如何操作?
  17. Java基础知识系列之-抽象abstract
  18. 转行产品经理必须要知道的三件事!
  19. 【Gin框架】框架入门
  20. [SAP] PP模块 - BOM ( Bill of Material)

热门文章

  1. java在注解中绑定方法参数的解决方案
  2. 简单的链式语法及实际运用(链式编程的基本原理)
  3. Linux环境下Redis集群实践
  4. 无界限设计加持!魅族手环正式亮相
  5. Android图片360全景旋转
  6. 一、Cocos2dx在visualStudio或者vc++中环境搭建(入门篇)
  7. Numpy的基本用法
  8. hiho_1089_floyd最短路
  9. 江苏理工学院计算学院实验教学管理系统[.NET项目]
  10. myeclipse智能提示设置