一、 sleep()和wait()方法的区别

sleep()方法

sleep()方法是Thread类的方法,通过其定义可知是个native方法,在指定的时间内阻塞线程的执行。而且从其注释中可知,并不会失去对任何监视器(monitors)的所有权,也就是说不会释放锁,仅仅会让出cpu的执行权。如下图所示

wait()方法

wait()方式是基类Object的方法,其实也是个native方法

不管是wait()还是wait(long timeout, int nanos),其调用的都是wait(long timeout)

The current thread must own this object's monitor

根据注释中的一句话,可以看出此方法调用的前提是当前线程已经获取了对象监视器monitor的所有权。

该方法会调用后不仅会让出cpu的执行权,还会释放锁(即monitor的所有权),并且进入wait set中,知道其他线程调用notify()或者notifyall()方法,或者指定的timeout到了,才会从wait set中出来,并重新竞争锁。

区别

最主要的区别就是释放锁(monitor的所有权)与否,但是两个方法都会抛出InterruptedException。

二、线程阻塞BLOCKED和等待WAITING的区别

阻塞BLOCKED

阻塞表示线程在等待对象的monitor锁,试图通过synchronized去获取某个锁,但是此时其他线程已经独占了monitor锁,那么当前线程就会进入等待状态。

等待WAITING

当前线程等待其他线程执行某些操作,典型场景就是生产者消费者模式,在任务条件不满足时,等待其他线程的操作从而使得条件满足。可以通过wait()方法或者Thread.join()方法都会使线程进入等待状态。

摘录

实际上不用可以区分两者, 因为两者都会暂停线程的执行. 两者的区别是: 进入waiting状态是线程主动的, 而进入blocked状态是被动的. 更进一步的说, 进入blocked状态是在同步(synchronized代码之外), 而进入waiting状态是在同步代码之内.(摘自csdn论坛中很好解答)

最新文章

  1. java时间段分成小段存储
  2. python动态网页爬取——四六级成绩批量爬取
  3. Full GC有关问题学习分析(转载)
  4. jQuery layer[页面弹出框]
  5. Gherkin学习笔记
  6. PHP实现好友生日邮件提醒
  7. linux小白成长之路6————安装Java+Apache(httpd)+Tomcat
  8. 《T-SQL查询》读书笔记Part 1.逻辑查询处理知多少
  9. AttributeError: 'NoneType' object has no attribute 'split' 报错处理
  10. HTML5培训入门基础知识了解CSS3 3D属性
  11. ORA-00847: MEMORY_TARGET/MEMORY_MAX_TARGET and LOCK_SGA cannot be set together
  12. 尚硅谷springboot学习15-日志框架1-入门
  13. IE 此网站的某个加载项无法运行
  14. PHP开发者成长图
  15. 数据库备份-SQL Server 维护计划
  16. 与数据库连接的页面增删改查 的easyui实现(主要是前端实现)
  17. (Spring Boot框架)快速入门
  18. day3心得
  19. jqGrid随窗口大小变化自适应宽度
  20. Accept 惊群现象测试perl脚本

热门文章

  1. 风炫安全WEB安全学习第十七节课 使用Sqlmap自动化注入(一)
  2. redhat_快捷键和shell命令操作.md
  3. 来不及解释!Linux常用命令大全,先收藏再说
  4. 【原创】X86_64汇编、寄存器、内嵌汇编
  5. 跟我一起学Redis之加个哨兵让主从复制更加高可用
  6. ctfhub技能树—sql注入—Cookie注入
  7. k8s集群中遇到etcd集群故障的排查思路
  8. 利用vbs隐藏dos窗口
  9. 单线程的as-if-serial语义
  10. 量子化学Gaussian技术实战课 2021年4月9号--12号 远程在线教学