java等待_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学习:等待唤醒机制相关推荐
- java 深拷贝_java 深拷贝与浅拷贝机制详解
java 深拷贝与浅拷贝机制详解 概要: 在Java中,拷贝分为深拷贝和浅拷贝两种.java在公共超类Object中实现了一种叫做clone的方法,这种方法clone出来的新对象为浅拷贝,而通过自己定 ...
- java 当前线程 等待_Java 多线程等待
背景 在一些场景中,我们需要获取多份数据,而这些数据获取的先后顺序是无关的,我们只需要把数据收集齐,然后再对这些数据统一处理. 比如:执行两个任务 task1 和 task2,都执行完毕后,再把两个任 ...
- java 堆_JAVA学习笔记 07——堆、栈和垃圾回收机制
程序执行的内存分析过程: 虚拟机栈(简称:栈)的特点如下: 1. 栈描述的是方法执行的内存模型.每个方法被调用都会创建一个栈帧(存储局部变量.操作数.方法出口等). 2. JVM为每个线程创建一个栈, ...
- java书籍_Java学习必备书籍(快来收藏)
Hello,everyone! 今天圆圆煞费苦心的从JavaGuide.CSDN.豆瓣读书等平台搜索相关信息为大家整理了一份学习<Java的必备书籍>精华推荐,希望能够帮助更多的热爱Jav ...
- java分割线_Java学习Day 1
TOP 1 Mark down 学习 标题 n级标题 n个#+空格+标题+回车 最多有六级 字体 原型 哈哈哈 左右加一个*为斜体 哈哈哈 两个*为加粗 哈哈哈** 三个 为斜体加粗 哈哈 ...
- qq传java文件_java学习:基于TCP的网络文件传输(可改写的QQ文件传输)
由于最近要写个仿聊天程序中文件传输的内容,又学习了一下流的知识 找了好久没找到很全的,后来不知道哪个地方找了个不错的客户端和服务器端的代码,自己改了下,感觉还行吧.放到博客上来帮助记忆 服务器端: p ...
- java 异常_Java学习——异常与异常处理
学习这件事不在乎有没有人教你,最重要的是在于你自己有没有觉悟和恒心.--法布尔 一.异常简介 异常:程序出现意外导致中断指令流的一种事件. 异常是一个类,继承于Throwable类,其中包括2个主要大 ...
- java瞎子_Java学习路线,及各方面知识点
一:入门阶段 学习目标:Java程序员 1: 熟悉jdk,jvm,eclipse,安装于配置jdk 2:熟悉并掌握java的基础语法,类,抽象类,接口,内部类等概念 3: java核心编程,如输入输 ...
- java教程_java学习的秘籍
(1)多练(2)多问(3)自己动手,调试错误(4)复习和总结(5)定期巩固自建的知识库与FAQ 且学且珍惜 查看全文 http://www.taodudu.cc/news/show-4430708.h ...
最新文章
- boost::mp11::mp_back相关用法的测试程序
- 【Envi风暴】Envi 5.1平台下植被覆盖度(VFC)的遥感估算
- Taro+react开发(45)taro中组件生命周期
- kali破解WiFi时wlan0没有变wlan0mon_黑客入门干货:黑客使用 Aircrack-ng 破解 Wi-Fi 密码
- 第四章 生命周期函数--36 结合Node手写JSONP服务器剖析JSONP原理
- 《恋上数据结构第1季》哈希表介绍以及从源码分析哈希值计算
- ping首包慢的问题(及icmp对应关系)
- utf8_unicode_ci和utf8_general_ci的区别,联系及使用
- hp服务器系统检测,HP服务器检测步骤.pdf
- Flask PyMongo的基本使用
- 从删库到跑路,DBA 如何防止被淘汰?
- 前程似锦 如鱼得水 藏头诗
- Python - 期货CTP常见问题解答
- mac10.9安装win7
- TLE7259-3GE 车用LIN收发器
- 历年计算机一级考试原题,全国计算机等级考试一级历年上机真题.doc
- 【转】车载导航电子地图走向标准化
- 新媒体写作如何变现?分享7个零成本知识变现的渠道
- 80后员工的12大缺点,管理他们需要18般兵器
- 关于集团高校宣讲流程
热门文章
- junit 参数化测试用例_JUnit:在参数化测试中命名单个测试用例
- jaxb list集合对象_JAXB –表示空集合和空集合
- 如何脚踏实地构建Java Agent
- couchbase_Couchbase 2.0归类视图简介
- Java命令行界面(第7部分):JCommander
- java堆 数据结构 堆_Java中的紧凑堆外结构/组合
- mockito 使用_用Mockito回答
- 在Java 8中进行投射(还有其他功能?)
- 您需要了解的有关默认方法的所有信息
- Spring XD 1.0.0.M5在这里!