41. wait notify 方法
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 方法的更多相关文章
- wait/notify方法
执行wait方法会释放锁,执行notify不会释放锁 package com.qf.test05.pojo; /** * @author qf * @create 2018-09-18 10:41 * ...
- java多线程详解(6)-线程间的通信wait及notify方法
Java多线程间的通信 本文提纲 一. 线程的几种状态 二. 线程间的相互作用 三.实例代码分析 一. 线程的几种状态 线程有四种状态,任何一个线程肯定处于这四种状态中的一种:(1). 产生(New) ...
- Java 多线程(七) 线程间的通信——wait及notify方法
线程间的相互作用 线程间的相互作用:线程之间需要一些协调通信,来共同完成一件任务. Object类中相关的方法有两个notify方法和三个wait方法: http://docs.oracle.com/ ...
- Java使用wait() notify()方法操作共享资源
Java多个线程共享资源: 1)wait().notify()和notifyAll()方法是本地方法,并且为final方法,无法被重写. 2)调用某个对象的wait()方法能让当前线程阻塞,并且当前线 ...
- 并发编程之 wait notify 方法剖析
前言 2018 元旦快乐. 摘要: notify wait 如何使用? 为什么必须在同步块中? 使用 notify wait 实现一个简单的生产者消费者模型 底层实现原理 1. notify wait ...
- Java中wait()和notify()方法的使用
1. wait方法和notify方法 这两个方法,包括notifyAll方法,都是Object类中的方法.在Java API中,wait方法的定义如下: public final void wait( ...
- 对象的notify方法的含义和对象锁释放的三种情况
1,notify的含义 (1)notify一次只随机通知一个线程进行唤醒 (2)在执行了notify方法之后,当前线程不会马上释放该对象锁,呈wait状态的线程也不能马上获得该对象锁, 要等到 ...
- wait()、notify()方法原理,以及使用注意事项
wait.notify原理 在前面以经说到对象锁的本质,实际上是对象头的一个监视器锁的数据结构.这个结构如下: (图片来源于网络) 几个线程一起竞争对象的锁(enter),只有一个能成功(acquir ...
- Java精通并发-透过openjdk源码分析wait与notify方法的本地实现
上一次https://www.cnblogs.com/webor2006/p/11442551.html中通过openjdk从c++的底层来审视了ObjectMonitor的底层实现,这次继续来探究底 ...
随机推荐
- 为IIS服务器配置SSL,并设置为默认使用https协议访问网站
要使网站支持https协议,需要SSL证书,我的服务器和域名都是在阿里云购买的,所以这里我演示阿里云获取SSL证书的方法 我先说下我的服务器环境:windows server 2012 + IIS8. ...
- 前端学习(十九)jquery(笔记)
jquery:库,框架 js,别人封装成的js 官网:http://jquery.com/ -----------------------------------1.7 ----------jq 1. ...
- kubernetes报错
错误信息:执行yaml文件后,服务在运行,但是提示命令找不到 原因:没有环境,相当于只有一个快捷方式 环境目录为/usr/local/bin 解决办法:将/etc/ansible/bin下的文件都拷贝 ...
- python输入问题
1.关于python的输入问题: 在2.x版本单行单输入input,单行多输入raw_input 在3.x版本中就已经没有raw_input,只有input,单行单输入多输入都可以. 类似2 3 4的 ...
- SpringBoot 2.x 使用 JWT(JSON Web Token)
一.跨域认证遇到的问题 由于多终端的出现,很多的站点通过 web api restful 的形式对外提供服务,采用了前后端分离模式进行开发,因而在身份验证的方式上可能与传统的基于 cookie 的 S ...
- Jmeter关联之正则表达式提取器(完整版)
Jmeter关联之正则表达式提取器(完整版) 在性能测试中,若想提取上一个请求的结果,作为下一次请求的参数,则需要使用关联~ 这篇博客主要讲jmeter正则表达式提取器的各种用法. 首先正则表达式 ...
- jQuery与Vue的区别、从jQuery到Vue框架优点总结
一.两者的区别 1.数据与视图分离 2.数据驱动视图 二.从jQuery到Vue框架的总结 1.数据与视图分离,解耦 2.数据驱动视图,只关心数据,DOM操作已经被框架封装
- c#开发应避免的几个小滥用
一 String和StringBuilder 少量的字符串操作不宜采用StringBuilder. 由于string是不可变得对象,对于string的叠加,每次操作 ...
- 【书上讲解】最大m段子段和问题
描述 [题解] 设f[i][j]表示前i个数字分成了j段的最大子段和. 则f[i][j] = max(f[i-1][j]+a[i] (第i个数字和第j段合在一起),f[k][j-1]+a[i] (第i ...
- element not visible的解决方法
抛出异常主题为element not visible主要有一下三个方面的原因. 元素之间存在逻辑关系,比如你要选择地址时,中国选择完毕之后,才能选择北京.如果想直接一步到位,则会出现element n ...