废话不多说,案例如下

 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()方法,案例总结的更多相关文章

  1. Java精通并发-wait与notify方法案例剖析与详解

    在上一节中对Object的wait.notify.notifyAll方法进行了总结,这次举一个具体案例来进行巩固,题目如下: 编写一个多线程程序,实现这样的一个目标: 1.存在一个对象,该对象有一个i ...

  2. java多线程详解(6)-线程间的通信wait及notify方法

    Java多线程间的通信 本文提纲 一. 线程的几种状态 二. 线程间的相互作用 三.实例代码分析 一. 线程的几种状态 线程有四种状态,任何一个线程肯定处于这四种状态中的一种:(1). 产生(New) ...

  3. Java 多线程(七) 线程间的通信——wait及notify方法

    线程间的相互作用 线程间的相互作用:线程之间需要一些协调通信,来共同完成一件任务. Object类中相关的方法有两个notify方法和三个wait方法: http://docs.oracle.com/ ...

  4. Java多线程_wait/notify/notifyAll方法

    关于这三个方法,我们可以查询API得到下列解释: wait():导致当前的线程等待,直到其他线程调用此对象的notify( ) 方法或 notifyAll( ) 方法或者指定的事件用完 notify( ...

  5. java 多线程:线程通信-等待通知机制wait和notify方法;(同步代码块synchronized和while循环相互嵌套的差异);管道通信:PipedInputStream;PipedOutputStream;PipedWriter; PipedReader

    1.等待通知机制: 等待通知机制的原理和厨师与服务员的关系很相似: 1,厨师做完一道菜的时间不确定,所以厨师将菜品放到"菜品传递台"上的时间不确定 2,服务员什么时候可以取到菜,必 ...

  6. Java Native Interface 五 JNI里的多线程与JNI方法的注册

    本文是<The Java Native Interface Programmer's Guide and Specification>读书笔记 JNI里的多线程 在本地方法里写有关多线程的 ...

  7. Java多线程 wait, notify 和 notifyAll

    Java的Object类 public class Object { public final native void notify(); public final native void notif ...

  8. Python爬虫(十八)_多线程糗事百科案例

    多线程糗事百科案例 案例要求参考上一个糗事百科单进程案例:http://www.cnblogs.com/miqi1992/p/8081929.html Queue(队列对象) Queue是python ...

  9. Java使用wait() notify()方法操作共享资源

    Java多个线程共享资源: 1)wait().notify()和notifyAll()方法是本地方法,并且为final方法,无法被重写. 2)调用某个对象的wait()方法能让当前线程阻塞,并且当前线 ...

随机推荐

  1. php实现微信扫码自动登陆与注册功能

    本文实例讲述了php实现微信扫码自动登陆与注册功能.分享给大家供大家参考,具体如下: 微信开发已经是现在程序员必须要掌握的一项基本的技术了,其实做过微信开发的都知道微信接口非常的强大做起来也非常的简单 ...

  2. linux服务器应用NTP配置时间同步

    linux服务器应用NTP配置时间同步 • 为什么建议使用ntpd而不是ntpdate? #####原因很简单,ntpd是步进式的逐渐调整时间,而ntpdate是断点更新,比如现在服务器时间是9.18 ...

  3. MySQL 索引知识整理(创建高性能的索引)

    前言: 索引优化应该是对查询性能优化的最有效的手段了.索引能够轻易将查询性能提高几个数量级. // 固态硬盘驱动器有和机械硬盘启动器,有着完全不同的性能特性: 然而即使是固态硬盘,索引的原则依然成立, ...

  4. 16-THREE.JS 半球光

    <!DOCTYPE html> <html> <head> <title></title> <script src="htt ...

  5. svn上传文件钩子

    svn钩子 钩子脚本就是shell的写法,钩子就是被某些版本库事件触发的程序. 常用钩子: post-commit:在提交完成成功创建之后执行该钩子.(提交已经完成,不可更改) 更新之后,通过邮件.微 ...

  6. centos下安装storm

    centOS安装ZeroMQ centOS安装ZeroMQ所需组件及工具: yum install gcc yum install gcc-c++ yum install make yum insta ...

  7. C# 之二进制序列化

    序列化:又称串行化,是.NET运行时环境用来支持用户定义类型的流化的机制.其目的是以某种存储形成使自定义对象持久化,或者将这种对象从一个地方传输到另一个地方. 一般有三种方式:1.是使用BinaryF ...

  8. SQL Sever 学习系列之三

    SQL Sever 学习系列之三 SQL Server 学习系列之一(薪酬方案+基础) SQL Server 学习系列之二(日期格式问题)         五.经理今天刚谈到with的用法(with的 ...

  9. SQL Sever 学习系列之二

    SQL Sever 学习系列之二 SQL Server 学习系列之一(薪酬方案+基础) 四.有关时间输出问题      select GETDATE() 日期时间    ----显示为:2013-07 ...

  10. BZOJ2724:[Violet 6]蒲公英

    浅谈分块:https://www.cnblogs.com/AKMer/p/10369816.html 题目传送门:https://lydsy.com/JudgeOnline/problem.php?i ...