http://www.cnblogs.com/DreamDrive/p/6204665.html  这个是用Lock类实现的.

场景:

厨师类:

 1 import java.util.List;
 2 import java.util.Random;
 3 import java.util.concurrent.TimeUnit;
 4
 5 public class Cook implements Runnable {
 6
 7     private List<Food> foods;
 8     private static int num = 1;
 9     private static final int MAXSIZE = 1;
10
11     public List<Food> getFoods() {
12         return foods;
13     }
14
15     public void setFoods(List<Food> foods) {
16         this.foods = foods;
17     }
18
19     public Cook(List<Food> foods) {
20         this.foods = foods;
21     }
22
23     public Cook() {
24     }
25
26     public void produce() {
27         while (true) {
28             synchronized (SaleWindow.class) {
29                 if (foods.size() < MAXSIZE) {//卖饭的桌子上饭总有 一定的容量限制.
30                     Food food = new Food((num++) + "");
31                     foods.add(food);
32                     System.out.println(Thread.currentThread().getName()
33                             + " :做好 " + food.getId() + " 号饭了");
34                     Random ran = new Random();
35                     int i = ran.nextInt(300);
36                     try {
37                         TimeUnit.MILLISECONDS.sleep(i);
38                     } catch (InterruptedException e) {
39                         e.printStackTrace();
40                     }
41
42                     //SaleWindow.class.notify();
43                     SaleWindow.class.notifyAll();
44                 } else {
45                     System.out.println(Thread.currentThread().getName()
46                             + " :桌子放满了。窗口赶紧卖,我休息了。。。");
47
48                     try {
49                         SaleWindow.class.wait();
50                     } catch (InterruptedException e) {
51                         e.printStackTrace();
52                     }
53                 }
54             }
55         }
56     }
57
58     @Override
59     public void run() {
60         produce();
61     }
62 }

食物类:

 1 public class Food {
 2
 3     private String id;
 4
 5
 6     public Food(String id) {
 7         this.id = id;
 8     }
 9
10     public String getId() {
11         return id;
12     }
13
14     public void setId(String id) {
15         this.id = id;
16     }
17
18
19 }

卖饭窗口类:

 1 import java.util.List;
 2 import java.util.Random;
 3 import java.util.concurrent.TimeUnit;
 4
 5 public class SaleWindow implements Runnable {
 6
 7     private List<Food> foods;
 8
 9     public List<Food> getFoods() {
10         return foods;
11     }
12
13     public void setFoods(List<Food> foods) {
14         this.foods = foods;
15     }
16
17     public SaleWindow(List<Food> foods) {
18         this.foods = foods;
19     }
20
21     public SaleWindow() {
22     }
23
24     public  void sale() {
25         while (true) {
26             synchronized (SaleWindow.class) {
27                 if (foods.size() > 0) {
28                     try {
29                         Food food = foods.get(0);
30                         System.out.println(Thread.currentThread().getName()
31                                 + ": 卖出了 " + food.getId() + " 号饭...");
32                         Random ran = new Random();
33                         int i = ran.nextInt(300);
34
35                         TimeUnit.MILLISECONDS.sleep(i);
36                         foods.remove(0);
37                         //SaleWindow.class.notify();//随机唤醒一条等待的线程
38                         SaleWindow.class.notifyAll();//唤醒所有等待的线程
39                     } catch (InterruptedException e) {
40                         e.printStackTrace();
41                     }
42                 }else{
43                     System.out.println(Thread.currentThread().getName()+":饭买完了。厨师赶紧做,我休息了。。。");
44                     try {
45                         SaleWindow.class.wait();
46                     } catch (InterruptedException e) {
47                         e.printStackTrace();
48                     }
49
50                 }
51             }
52         }
53     }
54
55     @Override
56     public void run() {
57         sale();
58     }
59
60 }

测试类:

 1 import java.util.ArrayList;
 2 import java.util.List;
 3
 4 public class Test {
 5
 6     public static void main(String[] args) {
 7
 8         List<Food> foods = new ArrayList<Food>();
 9         for (int i = 0; i < 4; i++) {//4个厨师 生产
10             new Thread(new Cook(foods),"Cook"+(i+1)).start();
11         }
12         for (int i = 0; i < 3; i++) {//3个窗口 消费
13             new Thread(new SaleWindow(foods),"sale"+(i+1)).start();
14         }
15     }
16 }

转载于:https://www.cnblogs.com/DreamDrive/p/6192685.html

线程中消费者生产者的实例代码(synchronized关键字)相关推荐

  1. 线程中消费者生产者的实例代码(使用Lock类)

    Lock可以替换synchronized. 上面用来做为锁对象的SaleWindow.class没有别的操作,而且获取锁和释放锁都是在内部隐藏完成的. Java的思想是万物皆对象,我们把这种锁也描述成 ...

  2. Java 线程池详解及实例代码

    转载自  Java 线程池详解及实例代码 这篇文章主要介绍了Java 线程池的相关资料,并符实例代码,帮助大家学习参考,需要的朋友可以参考下 线程池的技术背景 在面向对象编程中,创建和销毁对象是很费时 ...

  3. yii mysql 事务处理_Yii2中事务的使用实例代码详解

    前言 一般我们做业务逻辑,都不会仅仅关联一个数据表,所以,会面临事务问题. 数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全 ...

  4. vue build text html,Vue中v-text / v-HTML使用实例代码详解_放手_前端开发者

    废话少说,代码如下所述: /p> 显示123 /p> 补充:vuejs {{}},v-text 和 v-html的区别 {{message}} let app = new Vue({ el ...

  5. python输出变量代码_Python中变量的输入输出实例代码详解

    1.变量的输入: input函数: input() input("请输入银行卡密码") password = input("请输入银行卡密码") 变量名 = i ...

  6. 统计一段英文中单词的个数c语言,C语言统计一篇英文短文中单词的个数实例代码...

    具体代码如下所述: #include #define N 1000 void main(){ char en[N][81]; int i,j,num=0,n,state; //num 用来统计单词的个 ...

  7. java list 元素排序_对arraylist中元素进行排序实例代码

    rrayList中的元素进行排序,主要考查的是对util包中的Comparator接口和Collections类的使用. 实现Comparator接口必须实现compare方法,自己可以去看API帮助 ...

  8. java timer指定线程池_Java 定时器(Timer)及线程池里使用定时器实例代码

    java Timer定时器 简单实例代码:public class Test { public static void main(String[] args) { // Timer定时器 Timer ...

  9. c语言对一篇英文文章进行统计,C语言统计一篇英文短文中单词的个数实例代码...

    具体代码如下所述: #include #define N 1000 void main(){ char en[N][81]; int i,j,num=0,n,state; //num 用来统计单词的个 ...

  10. HTML自动获取地址,网页中自动获取经纬度值并在地图中显示当前位置实例代码...

    下面的HTML代码就是实例完整代码,如果你需要本项目完整实例代码,下载链接在文章最底部 网页中自动获取经纬度值并在地图中显示当前位置,可在地图中进行拖动选择当前位置并输出经纬度,这是项目实例代码,可参 ...

最新文章

  1. ubuntu笔记 - 安装和配置Sublime Text
  2. 文件及文件组备份与还原示例.sql
  3. Supplier 点participate时候用USB KEY的身份验证
  4. 全球数十亿条用户记录被泄露,姓名住址全曝光,Oracle或已引发今年最大的数据安全事件...
  5. MS SQL Server带有时间的记录怎样查询
  6. eclipse3.2 汉化 汉化包下载
  7. Python lstrip() 方法
  8. 与其他库一起使用jQuery
  9. 麻省理工18年春软件构造课程阅读13“调试”
  10. Labview双通道虚拟示波器完整程序
  11. 基于因子分析和聚类分析 的SPSS河南省各地区综合发展分析+操作步骤+全文详细
  12. tensorflowpython32_Python tensorflow.python.framework.dtypes 模块,float32() 实例源码 - 编程字典...
  13. 2020年2月15日 考试
  14. 2019-2022年中国定期存款基准利率走势(附三个月定期、半年定期、一年定期、二年定期及三年定期存款基准利率)[图]
  15. 章鱼猫(Octocat)
  16. 嵌入式系统的知识体系
  17. 让作业飞吧,与屌丝兄弟们分享我的分布式作业调度平台 【拥抱开源,拥抱作业调度的神器Quartz.net】...
  18. Win10永久修改命令提示符cmd的默认当前页码页为936(简体中文 GBK)
  19. Debian中文环境配置及几种中文编码的探究
  20. 学习STM32的寄存器版本好还是库函数版本好

热门文章

  1. 如何在 Mac 上合并 PDF?
  2. Mac 开机没声音了?只需 2 招关闭/恢复
  3. 如何制作macOS Monterey启动U盘
  4. 如何在苹果Mac上快速将表情符号添加到电子邮件?
  5. Mac上将Lightroom目录导入Capture One的详细步骤
  6. 如何在Premiere Pro 中使用动态图形模板
  7. android 图片上传图片 报Socket: Broken pipe
  8. Loadrunner关联
  9. apache编译出错 error: mod_deflate has been requested
  10. php 一个URL加密解密的程序