sleep() 和 wait() 有什么区别?
1、sleep就是正在执行的线程主动让出cpu,cpu去执行其他线程,在sleep指定的时间过后,cpu才会回到这个线程上继续往下执行
1.2、如果当前线程进入了同步锁,sleep方法并不会释放锁,即使当前线程使用sleep方法让出了cpu,但其他被同步锁挡住了的线程也无法得到执行。
2、wait是指在一个已经进入了同步锁的线程内,让自己暂时让出同步锁,以便其他正在等待此锁的线程可以得到同步锁并运行
2.2、只有其他线程调用了notify方法,调用wait方法的线程就会解除wait状态和程序可以再次得到锁后继续向下运行。
【注意】notify并不释放锁,只是告诉调用过wait方法的线程可以去参与获得锁的竞争了,但不是马上得到锁,因为锁还在别人手里,别人还没释放。如果notify方法后面的代码还有很多,需要这些代码执行完后才会释放锁
【总结】notify是告诉wait()的线程什么时候可以去继续去申请锁了
演示代码如下

package dgut.xiaozheng;public class demo2 {/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubnew Thread(new Thread1()).start();try {Thread.sleep(10);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}new Thread(new Thread2()).start();      }private static class Thread1 implements Runnable{@Overridepublic void run() {// TODO Auto-generated method stub
//由于这里的Thread1和下面的Thread2内部run方法要用同一对象作为监视器,我们这里不能用this,因为在Thread2里面的this和这个Thread1的this不是同一个对象。
//我们用MultiThread.class这个字节码对象,当前虚拟机里引用这个变量时,指向的都是同一个对象。synchronized (demo2.class) {System.out.println("enter thread1...");System.out.println("thread1 is waiting");try {//释放锁有两种方式,第一种方式是程序自然离开监视器的范围,也就是离开了synchronized关键字管辖的代码范围,//另一种方式就是在synchronized关键字管辖的代码内部调用监视器对象的wait方法。这里,使用wait方法释放锁。demo2.class.wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("thread1 is going on...");System.out.println("thread1 is being over!");           }}}private static class Thread2 implements Runnable{@Overridepublic void run() {// TODO Auto-generated method stubsynchronized (demo2.class) {System.out.println("enter thread2...");System.out.println("thread2 notify other thread can release wait status..");
//由于notify方法并不释放锁, 即使thread2调用下面的sleep方法休息了10毫秒,
//但thread1仍然不会执行,因为thread2没有释放锁,所以Thread1无法得不到锁。demo2.class.notify();System.out.println("thread2 is sleeping ten millisecond...");try {Thread.sleep(10);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("thread2 is going on...");System.out.println("thread2 is being over!");}}}   }

看结果

【总结:】首先先执行了thread1,打印两句话之后调用了wait方法,让出了本锁,然后往下执行,到线程thread2,它确实获得到了本锁,才会执行下面的语句,证明了wait方法确实是让出了本锁。然后打印了两句话,调用了notify()方法,告知thread1你可以去执行了。但是此时thread1没有锁,锁被thread2占用了。thread2继续执行。打印一句话之后,调用sleep()方法让出cpu,但是它不让出锁,所以thread1还是拿不到锁,执行不了,thread2睡眠完了之后,继续往下打印两句话,等执行完成之后让出改锁,thread1在继续执行。结果打印如上

sleep() 和 wait() 有什么区别?相关推荐

  1. RPC 笔记(01)— RPC概念、调用流程、RPC 与 Restful API 区别

    1. 基本概念 PRC 远程过程调用 Remote Procedure Call,其就是一个节点请求另外一个节点提供的服务.当两个物理分离的子系统需要建立逻辑上的关联时,RPC 是牵线搭桥的常见技术手 ...

  2. C++ 笔记(28)— C++ 中 NULL和 nullptr 的区别

    最近看公司代码的时候发现在判断指针是否为空的时候,有的时候用的是 NULL, 有的时候用的是 nullptr 感觉很奇怪,好奇心驱使我查了下两者的区别,发现还是有很多细节需要学习的. 1. NULL ...

  3. gcc 和 g++ 的联系和区别,使用 gcc 编译 c++

    GCC 编译器已经为我们提供了调用它的接口,对于 C 语言或者 C++ 程序,可以通过执行 gcc 或者 g++ 指令来调用 GCC 编译器. 实际使用中我们更习惯使用 gcc 指令编译 C 语言程序 ...

  4. Python2 与 Python3 区别

    Python2.x 与 Python3.x 区别 1. print 函数 Python2 中 print 是语句(statement),Python3 中 print 则变成了函数.在 Python3 ...

  5. Docker 入门系列(1)- 初识容器,镜像、容器、仓库的区别

    Docker 简介 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发 ...

  6. HTTP 协议入门 — (TCP/IP协议族、通信传输流、URI 与 URL 的区别、Cookie 状态管理、HTTP 支持的方法、状态码类别、HTTP 首部字段)

    TCP/IP协议族 在介绍 HTTP 协议之前,我们先对 TCP/IP 协议族有个大概的了解,TCP/IP 协议从上到下主要分为应用层.传输层.网络层和数据链路层,各层的主要功能如下表所示: 协议层 ...

  7. python二进制打开(rb)和文本格式打开(r)什么区别?

    使用 open() 函数以文本格式打开文件和以二进制格式打开文件,唯一的区别是对文件中换行符的处理不同. 在 Windows 系统中,文件中用 "\r\n" 作为行末标识符(即换行 ...

  8. python中__dict__与dir()区别

    前言 Python下一切皆对象,每个对象都有多个属性(attribute),Python对属性有一套统一的管理方案. __dict__与dir()的区别: dir()是一个函数,返回的是list: _ ...

  9. java和C#面向对象的区别

    问题:C#中的构造函数和java的构造函数一样吗? 答: .net的项目中,写实体Entity属性时,经常会为每一个属性写一对get和set方法,在用到这个实体或是一个类时,通过new实例化一个对象, ...

  10. 判别模型和生成模型的区别

    20210703 https://www.zhihu.com/question/20446337 机器学习"判定模型"和"生成模型"有什么区别? 重点 http ...

最新文章

  1. java动态代理【一】
  2. golang 正则表达式 简介
  3. 编译arm平台的ethtool
  4. 利用 squid 反向代理提高网站性能
  5. java import 出错,Eclipse的java代码出错:The import XXXX cannot be resolved
  6. Struts2中ActionContext介绍
  7. linux切换到字符界面stemctl,CentOS7两种模式
  8. 分享一个 GIFControl 控件
  9. java ==陷阱_Java小陷阱
  10. php数据字段多怎么存,一个保存时间的字段怎么存储数据
  11. Linux与Xshell:登陆服务器与后台执行程序
  12. 如何制作龙芯系统安装U盘
  13. mysql 10106_mysql出现:Can’t create TCP/IP socket (10106) (#2004)
  14. FlappyBird游戏介绍
  15. Spring IOC 和AOP 简单理解
  16. 思科新版ccna认证网工一定要知道的PIM技术概述
  17. protect 继承_public、protect、private继承方式 C++
  18. 《哲学家们都干了些什么》读后感
  19. 软件产品测试验收报告介绍
  20. 货币兑换(判断正环)

热门文章

  1. Python 操作 excel 插入图片、表格、设置单元格颜色、字体(三)
  2. 哪里可提供低代码开源大数据解决方案?
  3. 前端面试题整理(vue/js/css)
  4. 【笔记】ElementUI 组件的使用--选择日期,选择不了或者不回显
  5. 董明珠称“格力手机做得不比苹果差”哪里来的底气?
  6. 第三届计算机技能,我校第三届计算机基本技能大赛圆满结束
  7. 【Geometry】Introduction 计算机几何学(1)
  8. pygame获取系统中的字体
  9. KB4474419和 KB4490628
  10. [安装] Oracle19c rac集群安装