多线程 wait(),notify()方法,案例总结
废话不多说,案例如下
package com.xujingyang.Exok; /**
* 商品类
* @author 徐景洋
*/
public class Goods {
private String pinpai;
private String name; private int num; public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getPinpai() {
return pinpai;
}
public void setPinpai(String pinpai) {
this.pinpai = pinpai;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
} }
package com.xujingyang.Exok; /**
* 生产商类
* @author 徐景洋
*/
public class Producer implements Runnable {
private Goods goods; public Goods getGoods() {
return goods;
} public void setGoods(Goods goods) {
this.goods = goods;
} @Override
public void run() {
for (int i = 0; i < 5; i++) {
synchronized (goods) {
if(goods.getNum()>0){
try {
goods.wait();//商品数量已经大于0啦,消费者要取货咯,自己就开始等待咯
} catch (InterruptedException e) {
e.printStackTrace();
}
} if (i % 2 == 0) {
goods.setPinpai("哇哈哈");
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
goods.setName("矿泉水"); } else {
goods.setPinpai("旺仔");
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
goods.setName("小馒头");
}
goods.setNum((goods.getNum()+1));
System.out.println("生产了" + goods.getPinpai() + goods.getName());
goods.notify();//商品不够啦,自己生产完,然后通知消费者取货咯
}
}
} }
package com.xujingyang.Exok; /**
* 消费者类
* @author 徐景洋
*/
public class Customer implements Runnable { private Goods goods; public Goods getGoods() {
return goods;
} public void setGoods(Goods goods) {
this.goods = goods;
} @Override
public void run() {
for (int i = 0; i < 5; i++) {
synchronized (goods) {
if(goods.getNum()<=0){
try {//如果商品生产的数量小于0,则开始等待.只有有货才能购物嘛
goods.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
goods.setNum((goods.getNum()-1));
System.out.println("取走了" + goods.getPinpai() + goods.getName());
goods.notify();//取走之后通知生产商继续生产商品(唤醒在对象锁等待池中的线程继续执行)
}
}
} }
package com.xujingyang.Exok; /**
* 测试类
* @author 徐景洋
*/
public class Test {
public static void main(String[] args) {
Goods goods=new Goods(); //生产者生产商品
Producer p=new Producer();
p.setGoods(goods); //消费者取走商品
Customer c=new Customer();
c.setGoods(goods); new Thread(p).start();
new Thread(c).start();
}
}
清晰明了不,嘿嘿
多线程 wait(),notify()方法,案例总结的更多相关文章
- Java精通并发-wait与notify方法案例剖析与详解
在上一节中对Object的wait.notify.notifyAll方法进行了总结,这次举一个具体案例来进行巩固,题目如下: 编写一个多线程程序,实现这样的一个目标: 1.存在一个对象,该对象有一个i ...
- java多线程详解(6)-线程间的通信wait及notify方法
Java多线程间的通信 本文提纲 一. 线程的几种状态 二. 线程间的相互作用 三.实例代码分析 一. 线程的几种状态 线程有四种状态,任何一个线程肯定处于这四种状态中的一种:(1). 产生(New) ...
- Java 多线程(七) 线程间的通信——wait及notify方法
线程间的相互作用 线程间的相互作用:线程之间需要一些协调通信,来共同完成一件任务. Object类中相关的方法有两个notify方法和三个wait方法: http://docs.oracle.com/ ...
- Java多线程_wait/notify/notifyAll方法
关于这三个方法,我们可以查询API得到下列解释: wait():导致当前的线程等待,直到其他线程调用此对象的notify( ) 方法或 notifyAll( ) 方法或者指定的事件用完 notify( ...
- java 多线程:线程通信-等待通知机制wait和notify方法;(同步代码块synchronized和while循环相互嵌套的差异);管道通信:PipedInputStream;PipedOutputStream;PipedWriter; PipedReader
1.等待通知机制: 等待通知机制的原理和厨师与服务员的关系很相似: 1,厨师做完一道菜的时间不确定,所以厨师将菜品放到"菜品传递台"上的时间不确定 2,服务员什么时候可以取到菜,必 ...
- Java Native Interface 五 JNI里的多线程与JNI方法的注册
本文是<The Java Native Interface Programmer's Guide and Specification>读书笔记 JNI里的多线程 在本地方法里写有关多线程的 ...
- Java多线程 wait, notify 和 notifyAll
Java的Object类 public class Object { public final native void notify(); public final native void notif ...
- Python爬虫(十八)_多线程糗事百科案例
多线程糗事百科案例 案例要求参考上一个糗事百科单进程案例:http://www.cnblogs.com/miqi1992/p/8081929.html Queue(队列对象) Queue是python ...
- Java使用wait() notify()方法操作共享资源
Java多个线程共享资源: 1)wait().notify()和notifyAll()方法是本地方法,并且为final方法,无法被重写. 2)调用某个对象的wait()方法能让当前线程阻塞,并且当前线 ...
随机推荐
- 51nod 1131 数列
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1131 1131 覆盖数字的数量 基准时间限制:1 秒 空间限制:1310 ...
- php 执行结果可以直接重定向文件中
将php中的echo输出到shell上的结果,重定向到文件中. php script.php >result.txt;
- eclipse提交Git时忽略文件
为了避免每次使用都有百度查找,自己保存一份,方便使用. 实现方式: Eclipse切换到Navigator视图,找到.gitignore文件(如果是maven项目,一般找作为modules的项目的.g ...
- 分布式_理论_07_ZAB
一.前言 二.参考资料 1.分布式理论(七)—— 一致性协议之 ZAB
- 微信浏览器HTTP_USER_AGENT判断
微信公众平台开发 微信公众平台开发者 微信公众平台开发模式 微信浏览器 HTTP_USER_AGENT作者:方倍工作室 原文:http://www.cnblogs.com/txw1958/archiv ...
- linux内嵌汇编语言
http://blog.chinaunix.net/uid-21254310-id-1828921.html http://www.cnblogs.com/lxgeek/archive/2011/01 ...
- Rational Rose 2003 下载、破解及安装方法(图文)
方法一: 1. 安装Rational Rose2003时,在需选择安装项的时候,只选择Rational Rose EnterPrise Edition即可,不需选择其他项,之后选择“DeskTop I ...
- 每天一个linux命令(16):tail命令
版权声明更新:2017-05-20博主:LuckyAlan联系:liuwenvip163@163.com声明:吃水不忘挖井人,转载请注明出处! 1 文章介绍 本文介绍了Linux下面的mv命令. 2. ...
- Android Studio导入项目,报错 Error:Unsupported method: BaseConfig.getApplicationIdSuffix().
从GitHub上clone下来的第三方库,由于时间间隔很长,gradle的版本和本机的版本不一致,导入到Android Studio中会报错,错误信息如下: Error:Unsupported met ...
- BZOJ3489:A simple rmq problem
浅谈\(K-D\) \(Tree\):https://www.cnblogs.com/AKMer/p/10387266.html 题目传送门:https://lydsy.com/JudgeOnline ...