wait()      等待,如果一个线程执行了wait方法,那么该线程就会进去一个以锁对象为标识符的线程池中等待

notity()    唤醒,如果一个线程执行了notity方法,那么就会唤醒以锁对象为标识符的线程池中等待线程的其中一个(至于唤醒哪一个,不能确定)

notifyAll()   唤醒所有的线程

wait notity的使用注意事项:

      1.属于Object对象的

      2.必须要在同步代码块或者同步函数中使用

      3.必须要由锁对象调用

      4.要想唤醒等待的线程,它们的锁对象必须一样,否者无效

代码实例:

//生产者  消费者   商品,生产一个,就消费一个

//产品
class Product{
String name;
double price;
boolean flag = false;//判断是否生产完的标志
} //生产者
class Producer implements Runnable{
Product p; public Producer(Product p) {
this.p = p;
}
@Override
public void run() {
int i = 0;
while(true) {
synchronized (p) {
if(p.flag == false) {
if(i%2 == 0) {
p.name = "香蕉";
p.price = 2.0;
}else {
p.name = "苹果";
p.price = 6.5;
}
System.out.println("生产了"+p.name+"价格"+p.price);
i++;
p.flag = true;//生产完了
p.notify();//唤醒消费者消费
p.notifyAll();
}else {
try {
p.wait();//产品生产完了等待消费者去消费
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
} }
}
//消费者
class Customer implements Runnable{
Product p; public Customer(Product p) {
this.p = p;
}
@Override
public void run() {
while(true) {
synchronized (p) {
if(p.flag == true) {
System.out.println("消费者消费了"+p.name+"花费"+p.price);
p.flag = false;
p.notify();//唤醒生产者生产
}else {
try {
p.wait();//消费完了,等待生产者去生产
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
} }
}
public class Demo9 {
public static void main(String[] args) {
Product p = new Product();
Producer producer = new Producer(p);
Customer customer = new Customer(p);
Thread thread1 = new Thread(producer,"生产者");
Thread thread2 = new Thread(customer,"消费者");
thread1.start();
thread2.start();
}
}

41. wait notify 方法的更多相关文章

  1. wait/notify方法

    执行wait方法会释放锁,执行notify不会释放锁 package com.qf.test05.pojo; /** * @author qf * @create 2018-09-18 10:41 * ...

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

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

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

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

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

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

  5. 并发编程之 wait notify 方法剖析

    前言 2018 元旦快乐. 摘要: notify wait 如何使用? 为什么必须在同步块中? 使用 notify wait 实现一个简单的生产者消费者模型 底层实现原理 1. notify wait ...

  6. Java中wait()和notify()方法的使用

    1. wait方法和notify方法 这两个方法,包括notifyAll方法,都是Object类中的方法.在Java API中,wait方法的定义如下: public final void wait( ...

  7. 对象的notify方法的含义和对象锁释放的三种情况

    1,notify的含义     (1)notify一次只随机通知一个线程进行唤醒 (2)在执行了notify方法之后,当前线程不会马上释放该对象锁,呈wait状态的线程也不能马上获得该对象锁, 要等到 ...

  8. wait()、notify()方法原理,以及使用注意事项

    wait.notify原理 在前面以经说到对象锁的本质,实际上是对象头的一个监视器锁的数据结构.这个结构如下: (图片来源于网络) 几个线程一起竞争对象的锁(enter),只有一个能成功(acquir ...

  9. Java精通并发-透过openjdk源码分析wait与notify方法的本地实现

    上一次https://www.cnblogs.com/webor2006/p/11442551.html中通过openjdk从c++的底层来审视了ObjectMonitor的底层实现,这次继续来探究底 ...

随机推荐

  1. 取消SVN感叹号即去除版本库

    之前不小心直接将版本库 的内容检出 到桌面,后才发现桌面上的文件 都变成了问号,本来也以为没有多大问题,删除 .svn 即可,可是删除所有的.svn后,桌面上还是显示问号,刷新了很多次,还重启电脑 了 ...

  2. 使用ReadStream方法读取文件事件传递过程

    const fs = require('fs'); let file = fs.createReadStream("filename.js"); file.on("ope ...

  3. 【LeetCode】二分

    [475] Heaters [Easy] 给你一排房子,一排加热器.找到能warm所有房子的最小加热器半径. 思路就是对于每个房子,找离它最近的左右两台heater, 分别求距离.温暖这个房子的hea ...

  4. jmeter测试之-脚本制作

    一.脚本录制  1.遇见的问题,回放的时候总是登录失败 解决方式:设置HTTP请求为—跟随重定向 2.新增一个用户的时候,脚本参数里面输入汉字,在浏览器查看的时候显示问号 解决方式:脚本编码方式增加u ...

  5. UDP 两种丢包处理策略:丢包重传(ARQ) 和 前向纠错(FEC)

    目录 1. 两种丢包处理策略 2. 前向纠错(FEC) 3. 丢包重传(ARQ) [参考文献] 1. 两种丢包处理策略 为了保证实时性,通常适应UDP协议来针对RTP数据进行传输,而UDP无法保证数据 ...

  6. asp.net core容器&mysql容器network互联 & docker compose方式编排启动多个容器

    文章简介 asp.net core webapi容器与Mysql容器互联(network方式) docker compose方式编排启动多个容器 asp.net core webapi容器与Mysql ...

  7. 【Stanford Machine Learning Open Course】学习笔记目录

    这里是斯坦福大学机器学习网络课程的学习笔记. 课程地址是:https://class.coursera.org/ml-2012-002/lecture/index 课程资料百度网盘分享链接:https ...

  8. java实现邮件定时发送

    最近做项目时客户提出了一个需求:系统定时发送E-mail到其客户,达到通知的效果.先将实例分享给大家,如果确实有一些帮助的话,请大家来点掌声! 首先介绍java定时器(java.util.Timer) ...

  9. Feign 系列(04)Contract 源码解析

    Feign 系列(04)Contract 源码解析 [TOC] Spring Cloud 系列目录(https://www.cnblogs.com/binarylei/p/11563952.html# ...

  10. 真实的『REM』手机屏幕适配

    rem 作为一个低调的长度单位,由于手机端网页的兴起,在屏幕适配中得到重用.使用 rem 前端开发者可以很方便的在各种屏幕尺寸下,通过等比缩放的方式达到设计图要求的效果. rem 的官方定义『The ...