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