Java学习:等待唤醒机制
等待唤醒机制
线程的状态

- NEW 至今尚未启动的线程处于这种状态
- RUNNABLE 正在Java虚拟机中执行的线程处于这种状态
- BLOCKED 受阻塞并等待某个监视器锁的线程处于这种状态
- WAITING 无限期的等待另一个线程来执行某一待定操作的线程处于这种状态
- TIMED_WAITNG 等待另一个线程来执行取决于指定等待时间的操作的线程处于这种状态
- TERMINATED 已退出的线程处于这种状态。
- 阻塞状态:具有cpu的执行资格,等待cpu空闲时执行
- 休眠状态:放弃cpu的执行资格,cpu空闲,也不执行
等待唤醒案例分析
public static void sleep(Long millis):使用当前正在执行的线程以指定的毫秒数暂停(暂停停止执行).
- 毫秒数结束之后,线程继续执行
等待唤醒案例:线程之间的通信
- 创建一个顾客线程(消费者):告知老板要包子的中类和数量,调用wait方法,放弃cpu的执行,进入到WAITNG状态(无限等待)
- 创建一个老板线程(生产者):花了5秒做包子,做好包子之后,调用notify方法,唤醒顾客吃包子
注意:
- 顾客和老板线程必须使用同步代码块包裹起来,保证等待和唤醒只能有一个在执行
- 同步使用的锁对象必须保证唯一
- 只有锁对象才能调用wait和notify方法
Object类中的方法
void wait()
- 在其他线程调用此对象的notify()方法或notify() 方法前,导致当前线程等待。
void notify()
- 唤醒在此对象监视器上等待的单个线程。
- 会继续执行wait方法之后的代码
public class CaiNiao{
public static void main(String[] args){
//创建锁对象,保证唯一
Object obj = new Object();
//创建一个顾客线程(消费者)
new Thread(){
@Override
public void run(){
//一直等着买包子
while(true){
//保证等待和唤醒的线程只能有一个执行,需要使用同步技术
syncharonized (obj){
System.out.println("告知老板要的包子的种类和数量");
//调用wait方法,放弃cpu的执行,进入到WAITNG状态(无限等待)
try{
obj.wait();
}catch (InterruptedException e){
e.printStackTrace();
}
//唤醒之后执行的代码
System.out.println("包子已经做好了,开吃!");
System.out.println("--------------");
}
}
}
}.start();
//创建一个老板线程(生产者)
new Thread(){
@Override
public void run(){
//一直做包子
while(true){
//花5秒做包子
try{
Thread.sleep(5000);//花5秒做包子
}catch(InterruptedException e);
e.printStackTrace();
}
//保证等待和唤醒只能有一个在执行,需要使用同步技术
syncharonized (obj){
System.out.println("花了5秒做包子,做好包子之后,调用notify方法,唤醒顾客吃包子");
//做好包子之后,调用notify方法,唤醒顾客吃包子
obj.notify();
}
}
}.start();
}
Object类中wait带参方法和notify
进入到TimeWaiting(计时等待)有两种方法
- 使用sleep(Long m)方法,在毫秒值结束之后,线程睡醒进入到Runnable/Blacked状态
- 使用wait(Long m))方法,wait方法如果在毫秒值结束之后,还没有被notify唤醒,就会自动醒来,线程睡醒进入到Runnable/Blacked状态
唤醒的方法:
- void notify()唤醒在此对象监视器上等待的单个线程。
- void notifyAll()唤醒在此对象监视器上等待的所有线程。
调用wait和notify方法需要注意的细节
- wait方法与notify方法必须要由同一个锁对象调用。因为:对应的锁对象可以通过notify唤醒使用同一个锁对象调用的wait方法后的线程
- wait方法与notify方法是属于Object类的方法的。因为:锁对象可以是任意对象,而任意对象的所属类都是继承了Object类的。
- wait方法与notify方法必须要在同步代码块或者是同步函数中使用。因为:必须要通过锁对象调用这两个方法。
Java学习:等待唤醒机制的更多相关文章
- java之等待唤醒机制(线程之间的通信)
线程间通信 概念:多个线程在处理同一个资源,但是处理的动作(线程的任务)却不相同.比如:线程A用来生成包子的,线程B用来吃包子的,包子可以理解为同一资源,线程A与线程B处理的动作,一个是生产,一个是消 ...
- java基础知识回顾之java Thread类学习(八)--java多线程通信等待唤醒机制经典应用(生产者消费者)
*java多线程--等待唤醒机制:经典的体现"生产者和消费者模型 *对于此模型,应该明确以下几点: *1.生产者仅仅在仓库未满的时候生产,仓库满了则停止生产. *2.消费者仅仅在有产品的时 ...
- Android(java)学习笔记71:生产者和消费者之等待唤醒机制
1. 首先我们根据梳理我们之前Android(java)学习笔记70中关于生产者和消费者程序思路: 2. 下面我们就要重点介绍这个等待唤醒机制: (1)第一步:还是先通过代码体现出等待唤醒机制 pac ...
- Android(java)学习笔记11:生产者和消费者之等待唤醒机制
1. 首先我们根据梳理我们之前Android(java)学习笔记70中,关于生产者和消费者程序思路: 2. 下面我们就要重点介绍这个等待唤醒机制: (1)第一步:还是先通过代码体现出等待唤醒机制 下面 ...
- java基础知识回顾之java Thread类学习(七)--java多线程通信等待唤醒机制(wait和notify,notifyAll)
1.wait和notify,notifyAll: wait和notify,notifyAll是Object类方法,因为等待和唤醒必须是同一个锁,不可以对不同锁中的线程进行唤醒,而锁可以是任意对象,所以 ...
- “全栈2019”Java多线程第三十二章:显式锁Lock等待唤醒机制详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- “全栈2019”Java多线程第二十四章:等待唤醒机制详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- Java中的等待唤醒机制—至少50%的工程师还没掌握!
这是一篇走心的填坑笔记,自学Java的几年总是在不断学习新的技术,一路走来发现自己踩坑无数,而填上的坑却屈指可数.突然发现,有时候真的不是几年工作经验的问题,有些东西即使工作十年,没有用心去学习过也不 ...
- java多线程中的生产者与消费者之等待唤醒机制@Version1.0
一.生产者消费者模式的学生类成员变量生产与消费demo,第一版1.等待唤醒: Object类中提供了三个方法: wait():等待 notify():唤醒单个线程 notify ...
随机推荐
- android studio学习---菜单栏BUILD功能
项目构建: 1.构建项目 2.重构项目 3.签名打包
- WDA基础十八:Select option配置
为了省代码...为了方便管理WDA的查询条件... 首先建配置表: 说明: 上面的KEY基本都是维护的维度,可以根据销售组织,根据用户组,根据组件,根据SELECT OPTION的不同...等等,可以 ...
- URL&HTTP协议
一般来讲,URL地址有五个部分组成,协议,域名,端口,路径,URL地址参数,通常“//'之前的部分就是协议 常用的协议有: http 超文本传输协议 htttps http+ssl ssh 用来实现远 ...
- Linux shell awk逻辑控制语句
awk逻辑控制语句 1,if...else 格式: if(条件){语句:语句} else {语句1:语句2} 如果statement只有一条语句,{}可以不写 以冒号为分隔符,判断第一个字段,如果为r ...
- 腾讯面试Android高级岗,居然被一个多线程基础面倒了?
前言 一个在深圳从事开发五年的老友一个月前从原公司辞职后,昨天去腾讯总部面试Android高级岗,一面的时候,自我介绍后,陆陆续续问了很多问题,有着五年的从业经验很多项目开发的技术问题都回答的很通顺, ...
- Kibana 的 docker 镜像使用
1.dockhub镜像网址:https://hub.docker.com/_/kibana 2.下载镜像: docker pull kibana:7.4.0 3.创建容器(Kibana 默认的端口为5 ...
- Linux 命令 mv
mv 命令 --no-target-directory 参数确保对目录进行重命名而不是移动 https://www.gnu.org/software/coreutils/manual/html_nod ...
- Java 静态、类加载
1.静态是什么?有什么用? static的主要作用在于创建独立于具体对象的域变量或者方法. 每创建一个对象,都会在堆里开辟内存,存成员(属性),但是不存方法,方法是共用的,没必要每一个对象都浪费内存去 ...
- JavaScript基础09——事件驱动
1.事件驱动 js控制页面的行为是由事件驱动的. 什么是事件?(怎么发生的) 事件就是js侦测到用户的操作或是页面上的一些行为 事件源(发生在谁身上) 引 ...
- 1. Spring Cloud Greenwich SR2 概览
Spring Cloud provides tools for developers to quickly build some of the common patterns in distribut ...