线程中消费者生产者的实例代码(synchronized关键字)
http://www.cnblogs.com/DreamDrive/p/6204665.html 这个是用Lock类实现的.
场景:

厨师类:
import java.util.List;
import java.util.Random;
import java.util.concurrent.TimeUnit; public class Cook implements Runnable { private List<Food> foods;
private static int num = 1;
private static final int MAXSIZE = 1; public List<Food> getFoods() {
return foods;
} public void setFoods(List<Food> foods) {
this.foods = foods;
} public Cook(List<Food> foods) {
this.foods = foods;
} public Cook() {
} public void produce() {
while (true) {
synchronized (SaleWindow.class) {
if (foods.size() < MAXSIZE) {//卖饭的桌子上饭总有 一定的容量限制.
Food food = new Food((num++) + "");
foods.add(food);
System.out.println(Thread.currentThread().getName()
+ " :做好 " + food.getId() + " 号饭了");
Random ran = new Random();
int i = ran.nextInt(300);
try {
TimeUnit.MILLISECONDS.sleep(i);
} catch (InterruptedException e) {
e.printStackTrace();
} //SaleWindow.class.notify();
SaleWindow.class.notifyAll();
} else {
System.out.println(Thread.currentThread().getName()
+ " :桌子放满了。窗口赶紧卖,我休息了。。。"); try {
SaleWindow.class.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
} @Override
public void run() {
produce();
}
}
食物类:
public class Food {
private String id;
public Food(String id) {
this.id = id;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
卖饭窗口类:
import java.util.List;
import java.util.Random;
import java.util.concurrent.TimeUnit; public class SaleWindow implements Runnable { private List<Food> foods; public List<Food> getFoods() {
return foods;
} public void setFoods(List<Food> foods) {
this.foods = foods;
} public SaleWindow(List<Food> foods) {
this.foods = foods;
} public SaleWindow() {
} public void sale() {
while (true) {
synchronized (SaleWindow.class) {
if (foods.size() > 0) {
try {
Food food = foods.get(0);
System.out.println(Thread.currentThread().getName()
+ ": 卖出了 " + food.getId() + " 号饭...");
Random ran = new Random();
int i = ran.nextInt(300); TimeUnit.MILLISECONDS.sleep(i);
foods.remove(0);
//SaleWindow.class.notify();//随机唤醒一条等待的线程
SaleWindow.class.notifyAll();//唤醒所有等待的线程
} catch (InterruptedException e) {
e.printStackTrace();
}
}else{
System.out.println(Thread.currentThread().getName()+":饭买完了。厨师赶紧做,我休息了。。。");
try {
SaleWindow.class.wait();
} catch (InterruptedException e) {
e.printStackTrace();
} }
}
}
} @Override
public void run() {
sale();
} }
测试类:
import java.util.ArrayList;
import java.util.List; public class Test { public static void main(String[] args) { List<Food> foods = new ArrayList<Food>();
for (int i = 0; i < 4; i++) {//4个厨师 生产
new Thread(new Cook(foods),"Cook"+(i+1)).start();
}
for (int i = 0; i < 3; i++) {//3个窗口 消费
new Thread(new SaleWindow(foods),"sale"+(i+1)).start();
}
}
}
线程中消费者生产者的实例代码(synchronized关键字)的更多相关文章
- 线程中消费者生产者的实例代码(使用Lock类)
http://www.cnblogs.com/DreamDrive/p/6192685.html 这个是用synchronized关键字实现的. Lock可以替换synchronized. 上面用来做 ...
- Java线程中的join使用实例
JDK中解释为 Waits for this thread to die. 等待本线程结束后,下一个线程才可以运行. 实例要求: 现在有T1.T2.T3三个线程,你怎样保证T2在T1执行完后执行,T3 ...
- Java线程和多线程(十四)——Synchronized关键字解析
曾经有一个比较有趣的面试问题,那就是,关于使用synchronized关键字,是用在方法上面尾号,还是用在一个代码块上面为好? 答案就是使用锁定代码块为更好.因为这样不会锁定对象.当synchroni ...
- 《Lua程序设计》9.2 管道(pipe)与过滤器(filter) 包含使用协同函数实现“生产者——消费者”问题的实例代码
一个关于协同程序的经典示例是“生产者-消费者”问题.这其中涉及到两个函数,一个函数不断地产生值(比如从一个文件中读取值),另一个则不断地消费这些值(比如将这些值写到另一个文件).通常,这两个函数大致是 ...
- 详解 HTML5 中的 WebSocket 及实例代码-做弹幕
原文链接:http://www.php.cn/html5-tutorial-363345.html
- java线程总结--synchronized关键字,原理以及相关的锁
在多线程编程中,synchronized关键字非常常见,当我们需要进行“同步”操作时,我们很多时候需要该该关键字对代码块或者方法进行锁定.被synchronized锁定的代码块,只能同时有一条线程访问 ...
- 线程中start和run方法的区别
先说java中实现多线程常用的两种方式: 1:继承Thread类,并重写run()方法 2:实现Runnable接口,实现run方法实际上Thread类也是实现了Runnable接口 [Jav ...
- jQuery中index()方法用法实例
本文实例讲述了jQuery中index()方法用法.分享给大家供大家参考.具体分析如下: 此方法可以搜索匹配元素,并返回元素的索引值.索引值是从0开始的. 语法结构一: 当此方法没有参数的时候,返回值 ...
- Java多线程初学者指南(10):使用Synchronized关键字同步类方法
要想解决“脏数据”的问题,最简单的方法就是使用synchronized关键字来使run方法同步,代码如下: public synchronized void run() { ... } 从上面的代码可 ...
随机推荐
- gj13 asyncio并发编程
13.1 事件循环 asyncio 包含各种特定系统实现的模块化事件循环 传输和协议抽象 对TCP.UDP.SSL.子进程.延时调用以及其他的具体支持 模仿futures模块但适用于事件循环使用的Fu ...
- abaqus UMAT二次开发能用fortran90吗?
SUBROUTINE UMAT(STRESS,STATEV,DDSDDE,SSE,SPD,SCD,RPL,DDSDDT, # DRPLDE,DRPLDT,STRAN,DSTRAN,TIME,DTIME ...
- Ng第二课:单变量线性回归(Linear Regression with One Variable)
二.单变量线性回归(Linear Regression with One Variable) 2.1 模型表示 2.2 代价函数 2.3 代价函数的直观理解 2.4 梯度下降 2.5 梯度下 ...
- MapGIS10.3新功能
智能的GIS 支持开放的数据集.数据库.等等 T-C-V 软件结构是继局部网软件的 C/S 结构,互联网软件的 B/S 结构发展起来的适合云 计算.云服务的新一代软件三层结构,分别为终端应用层(T 层 ...
- webService之helloword(java)
webservice 远程数据交互技术 1.导入jar包(如果是 maven项目导入项目坐标) 2.创建服务 3.测试服务 我们使用maven来做测试服务 pom.xml文件 <project ...
- (动态规划)Worm -- hdu -- 2151
http://acm.hdu.edu.cn/showproblem.php?pid=2151 Worm Time Limit: 1000/1000 MS (Java/Others) Memory ...
- Alpha阶段敏捷冲刺(三)
1.提供当天站立式会议照片一张. 2.每个人的工作 (有work item 的ID),并将其记录在码云项目管理中: 昨天已完成的工作. 吴玲:一边学习,一边参考别人的代码. 王兴:完成了数据库的初步搭 ...
- htpasswd建立和更新存储用户名、密码
htpasswd建立和更新存储用户名.密码的文本文件, 用于对HTTP用户的basic认证. # /usr/local/apache/bin/htpasswd --help Usage: htpass ...
- MAC系统下用Idea创建spring boot工程 基于maven
1.创建项目 打开idea编辑器,选择file -> new -> project 点击next 依次填入group,artifact 填写完成之后再点击“next” 根据自己的需求在最 ...
- WinForm中DataGridView的TextBoxColumm换行
一.内容超过显示宽度自动换行: 在需要自动换行的列中设置 二.换行符换行: 一开始在需要换行的文本添加"\r\n"并不能直接换行,DGV直接把\r\n显示出来了,后换成 Syste ...