废话不多说,案例如下

 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. 应该是实例化对象的没有对属性赋值时,自动赋值为null,但不是空指针对象引用

    此时会输出两个null. Users类的实例是myUsers,但是由于javabean的作用范围是page,所以前面页面传送的javabean的设置的属性全部不能接收到.所以对象myUsers属性为自 ...

  2. BEC listen and translation exercise 9

    You will do foolish things, but do them with enthusiasm. 你难免会做傻事,但要做,就做得满怀激情. In addition, there sho ...

  3. 使用POI导出excel进阶篇

    进阶篇就是涉及到合并单元格了.就是某一列相同的单元格需要合并为一个,并分为多个sheet. 效果如图: 直接上代码,需要提供的数据自己搞,传到工具类里面就好. JcExcelVoSuper.java ...

  4. Sqoop-从hive导出分区表到MySQL

    经多次验证,发现并没有特殊的方法能够直接把多个分区一次性读入,并插入MySQL的方法,以后发现会在此添加. Sqoop只提供了从MySQL导入到HIVE分区表的相关参数,反向并无特别参数. 从HIVE ...

  5. 把ASM下的HDD VM转换成ARM下Managed Disk的SSD VM

    在ASM下,要把HDD的VM转换成SSD的VM步骤非常复杂.需要手工把Disk从普通存储账户复制到高级存储账户.再通过这个Disk创建VM. 目前在有了ASM到ARM的迁移工具,以及Managed D ...

  6. CentOS6.5上安装Python2.7和PIP

    目前大部分用户使用的CentOS6.5上默认的Python还是2.6版本.升级到Python2.7碰到很多问题.本文将介绍如何安装Python2.7. 1. 安装必要的准备包 安装过程将用到gcc,方 ...

  7. java代码继承super

    总结:多态 :. 当重写父类的方法的时,子类对象名可以调用父类的方法,以及不带参的构造方法 package com.addd; public class rr { int a, b; String c ...

  8. java流的操作步骤、、

    在java中使用IO操作必须按照以下的步骤完成: 使用File找到一个文件 使用字节流或字符流的子类为OutputStream.InputStream.Writer.Reader进行实例化操    作 ...

  9. PostgreSQL 监控磁盘使用

    监控磁盘使用 1. 判断磁盘用量 每个表都有一个主要的堆磁盘文件,大多数数据都存储在其中.如果一个表有着可能会很宽(尺寸大)的列, 则另外还有一个TOAST文件与这个表相关联, 它用于存储因为太宽而不 ...

  10. C字符串翻转

    实现字符串翻转,思路很简单,就是首尾字符对调. void reverse(char* str){ char* p = str + strlen(str) - 1;//最后一个字符地址 char tem ...