线程中消费者生产者的实例代码(synchronized关键字)
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关键字)相关推荐
- 线程中消费者生产者的实例代码(使用Lock类)
Lock可以替换synchronized. 上面用来做为锁对象的SaleWindow.class没有别的操作,而且获取锁和释放锁都是在内部隐藏完成的. Java的思想是万物皆对象,我们把这种锁也描述成 ...
- Java 线程池详解及实例代码
转载自 Java 线程池详解及实例代码 这篇文章主要介绍了Java 线程池的相关资料,并符实例代码,帮助大家学习参考,需要的朋友可以参考下 线程池的技术背景 在面向对象编程中,创建和销毁对象是很费时 ...
- yii mysql 事务处理_Yii2中事务的使用实例代码详解
前言 一般我们做业务逻辑,都不会仅仅关联一个数据表,所以,会面临事务问题. 数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全 ...
- vue build text html,Vue中v-text / v-HTML使用实例代码详解_放手_前端开发者
废话少说,代码如下所述: /p> 显示123 /p> 补充:vuejs {{}},v-text 和 v-html的区别 {{message}} let app = new Vue({ el ...
- python输出变量代码_Python中变量的输入输出实例代码详解
1.变量的输入: input函数: input() input("请输入银行卡密码") password = input("请输入银行卡密码") 变量名 = i ...
- 统计一段英文中单词的个数c语言,C语言统计一篇英文短文中单词的个数实例代码...
具体代码如下所述: #include #define N 1000 void main(){ char en[N][81]; int i,j,num=0,n,state; //num 用来统计单词的个 ...
- java list 元素排序_对arraylist中元素进行排序实例代码
rrayList中的元素进行排序,主要考查的是对util包中的Comparator接口和Collections类的使用. 实现Comparator接口必须实现compare方法,自己可以去看API帮助 ...
- java timer指定线程池_Java 定时器(Timer)及线程池里使用定时器实例代码
java Timer定时器 简单实例代码:public class Test { public static void main(String[] args) { // Timer定时器 Timer ...
- c语言对一篇英文文章进行统计,C语言统计一篇英文短文中单词的个数实例代码...
具体代码如下所述: #include #define N 1000 void main(){ char en[N][81]; int i,j,num=0,n,state; //num 用来统计单词的个 ...
- HTML自动获取地址,网页中自动获取经纬度值并在地图中显示当前位置实例代码...
下面的HTML代码就是实例完整代码,如果你需要本项目完整实例代码,下载链接在文章最底部 网页中自动获取经纬度值并在地图中显示当前位置,可在地图中进行拖动选择当前位置并输出经纬度,这是项目实例代码,可参 ...
最新文章
- ubuntu笔记 - 安装和配置Sublime Text
- 文件及文件组备份与还原示例.sql
- Supplier 点participate时候用USB KEY的身份验证
- 全球数十亿条用户记录被泄露,姓名住址全曝光,Oracle或已引发今年最大的数据安全事件...
- MS SQL Server带有时间的记录怎样查询
- eclipse3.2 汉化 汉化包下载
- Python lstrip() 方法
- 与其他库一起使用jQuery
- 麻省理工18年春软件构造课程阅读13“调试”
- Labview双通道虚拟示波器完整程序
- 基于因子分析和聚类分析 的SPSS河南省各地区综合发展分析+操作步骤+全文详细
- tensorflowpython32_Python tensorflow.python.framework.dtypes 模块,float32() 实例源码 - 编程字典...
- 2020年2月15日 考试
- 2019-2022年中国定期存款基准利率走势(附三个月定期、半年定期、一年定期、二年定期及三年定期存款基准利率)[图]
- 章鱼猫(Octocat)
- 嵌入式系统的知识体系
- 让作业飞吧,与屌丝兄弟们分享我的分布式作业调度平台 【拥抱开源,拥抱作业调度的神器Quartz.net】...
- Win10永久修改命令提示符cmd的默认当前页码页为936(简体中文 GBK)
- Debian中文环境配置及几种中文编码的探究
- 学习STM32的寄存器版本好还是库函数版本好