sleep 和 wait 的区别

为什么80%的码农都做不了架构师?>>>   hot3.png

面试中常问的就是 sleep 和 wait 有什么不同吗?为了面试时候发挥的更好,我在这里总结分享下。

首先对于 sleep() 方法,我们首先要知道该方法是属于 Thread 类中的。而 wait() 方法,则是属于Object类中的。(说完这句之后面试官会不会问你说下 object 类中的方法。。。哈哈哈)

最主要是 sleep 方法不会释放对象锁 ,而 wait 方法释放对象锁 。

sleep() 方法是线程类(Thread)的静态方法,让调用线程进入睡眠状态,让出执行机会给其他线程,等到休眠时间结束后,线程进入就绪状态和其他线程一起竞争 cpu 的执行时间。
因为 sleep() 是 static 静态的方法,他不能改变对象的机锁,当一个 synchronized 块中调用了 sleep() 方法,线程虽然进入休眠,但是对象的机锁没有被释放,其他线程依然无法访问这个对象。

当一个线程执行到 wait 方法时,它就进入到一个和该对象相关的等待池,同时释放对象的机锁,使得其他线程能够访问,可以通过 notify,notifyAll 方法来唤醒等待的线程。

package com.example.demo;public class T {public static void main(String[] args) {new Thread(new t1()).start();try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}new Thread(new t2()).start();}private static class t1 implements Runnable {@Overridepublic void run() {synchronized (T.class) {System.out.println("start t1...");System.out.println("t1 wait...");try {// 调用 wait()方法,线程会放弃对象锁,进入等待此对象的等待锁定池T.class.wait();} catch (Exception e) {e.printStackTrace();}}System.out.println("t1 going on....");System.out.println("t1 over...");}}private static class t2 implements Runnable {@Overridepublic void run() {synchronized (T.class) {System.out.println("start t2...");System.out.println("t2 sleep...");// 只有针对此对象调用 notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。T.class.notify();try {// sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。// 在调用 sleep()方法的过程中,线程不会释放对象锁。Thread.sleep(3000);} catch (Exception e) {e.printStackTrace();}System.out.println("t2 going on....");System.out.println("t2 over...");}}}
}

第一种情况结果,使用 wait 释放锁,并且唤醒等待线程。

619db10d710f345de4478bf82b51e767ead.jpg

第二种情况不唤醒等待线程,注释掉

T.class.wait();

结果程序会一直挂起。

53a42868a27da17e1b79ee66180d3fcc187.jpg

 

水平有限,若有问题请留言交流!

互相学习,共同进步:) 转载请注明出处谢谢!

转载于:https://my.oschina.net/hp2017/blog/1863078

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/254000.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2016年11月13日周工作知识点总结

jQuery :eq() 选择器选取带有指定 index 值的元素。index 值从 0 开始,所有第一个元素的 index 值是 0(不是 1)。经常与其他元素/选择器一起使用,来选择指定的组中特定序号的元素(如下面的例子)。$("p…

DM6467之视频采集(Linux)下MMAP

做dsp6467是在linux下做视频采集,仅ARM端 一共有三种视频采集方式: 1)使用read、write方式:直接使用 read 和 write 函数进行读写。这种方式最简…

QPS、TPS计算

QPS (Query per second) (每秒查询量) TPS(Transaction per second) (每秒事务量,如果是InnoDB会显示,没有InnoDB就不会显示) 计算方法 QPS Questions SHOW GLOBAL STATUS LIKE Questions; Uptime SHOW G…

QT 中textEdit 和 textBrowser 无法使用斜体及加粗等 解决办法

编辑框的几个种类 QT 中一共四个文本编辑框 分别是 Line Edit 、Text Edit、 Plait Text Edit和textBrowser四种文本编辑框架! 一、输入内容不同 1、LineEdit:LineEdit的输入内容为单行文本输入。 2、TextEdit:TextEdit的输入内容为多行文…

【select模块】select IO多路复用和select实现FTP

select是全平台通用的IO多路复用模块。最大连接数:1024。poll和epoll没有最大连接数限制,但只能用在linux平台。selectors是再封装模块,推荐使用。下篇会讨论。select.select(rlist, wlist, xlist[, timeout])This is a straightforward inte…

变量属性

变量属性 C语言的变量属性 C语言中的变量可以有自己的属性在定义变量的时候加上“属性”关键字属性关键字指明变量的特有意义auto关键字 auto即C语言中局部变量的默认属性auto表明将被修饰的变量存储在栈上编译器默认所有的局部变量都是auto的register关键字 register关键字指明…

WPF:How to display a Bitmap on Image control

一个Bitmap文件,叫做screenShotFile, 你可以这样显示到Image控件上。 BitmapImage bi new BitmapImage(); bi.BeginInit(); bi.UriSource new Uri(this.screenShotFile, UriKind.Absolute); bi.EndInit(); this.scre…

QT中$$PWD的意思

$$PWD的意思为当前目录 如pro文件中:INCLUDEPATH $$PWD/lib/x64-win64 $$PWD表示的意思就是pro文件所在的目录。

Dubbo 整合 Pinpoint 做分布式服务请求跟踪

2019独角兽企业重金招聘Python工程师标准>>> 在使用Dubbo进行服务化或者整合应用后,假设某个服务后台日志显示有异常,这个服务又被多个应用调用的情况下,我们通常很难判断是哪个应用调用的,问题的起因是什么&#xff0…

Linux 进程详解

Linux内核的七大区间 1.进程管理(进程创建,进程的三种状态,进程间的调度,调度算法...) 2.内存管理(段式管理(Linux所有段都从0开始),页式管理--地址偏移量) 3…

C#2.0 委托

委托 委托是一个非常不错的设计,允许我们把方法做为参数传递,实现了开放閉放原则。在方法中我们只要有一个委托占位,调用者就可以传入符合签名的方法来做不同的操作,这也面向对象开发中多态的魅力。 但是在C#1.0的时候&#xff…

qt乱码Could not decode“xxx.cpp“ with “UTF-8“-encoding.Editing not possible问题处理

问题描述:如题: 解决方法: 1、点击Select Encoding按钮 2、选择按照系统编码 3、选中System后点击按编码重新载入 4、问题解决

bootargs中的环境变量说明和一些常用的uboot命令

bootargs中的环境变量说明和一些常用的uboot命令 一些常见的uboot命令: Help [command]在屏幕上打印命令的说明 Boom [addr]启动在内存储器的内核 Tftpboot通过tftp启动内核 Saveenv保存环境变量 setenv name [value] 设置环境变量 bootargs中的环境变量 co…

特斯拉自动驾驶系统秘密,来自特斯拉AI总监爆料

据外媒报道,特斯拉汽车公司人工智能(AI)总监安德烈卡帕西(Andrej Karpathy)日前参加2018年TRAIN AI大会时,剖析了该公司构建自动驾驶仪(Autopilot)计算机视觉解决方案的方法。据介绍,Autopilot编…

快捷键汇总

navicat 运行选中代码 ctrshiftr navicat 运行所有代码 ctrr 快速显示桌面 wind 转载于:https://www.cnblogs.com/caer/p/6064571.html

js做倒计时

var dinshiqi setInterval(timerun,1000) function timerun(){ //timegundong var now_time new Date(); var hours now_time.getHours(); //时 var minutes now_time.getMinutes(); //分 var seconds now_time.getSeconds(); //秒 //秒钟 show_seconds 59 - parseInt(s…

QT右键点击添加库不响应的解决办法

问题描述 QT在pro右键点击添加库不响应 解决方案 双击打开pro文件 在pro文件界面里单击鼠标右键,并选择添加库。 解决问题

爬取前尘无忧python职位信息并保存到mongo数据库

1.re实现 1 import re,os2 import requests3 from requests.exceptions import RequestException4 5 MAX_PAGE 10 #最大页数6 KEYWORD python7 headers {8 User-Agent:9 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, lik…

实验八——函数定义及调用总结

1.本次课学习到的知识点: (1)学习了数字金字塔。pyramid ()函数功能,函数定义时,形参n决定数字金字塔的层数; (2)不返回结果的函数定义: (3)复数运算: c1x1(y1) i,c2x2(y…

Apache JMeter 记一次使用HTTP工具POST提交JSON数据进行送积分高并发压测(二)

一、前言 前面文章已经介绍Apache JMeter的基本概率和如果使用,但作为一个开发人员,自己写的代码都应该要好好的COD EREVIEW,好好的自测吧。但是有些场景比如高并发、负载和性能测试的时候,不借助工具是不好进行测试的。Jmter工具设计之初是用…