Java线程的WAITING状态和BLOCKED状态之间区别的一点理解
先说结论:WAITING状态是线程在获取锁对象之后,由于某些原因需要等待一些事件的完成才能继续执行,这时线程调用Object.wait()、Thread.sleep()、Thread.join()等方法进入WAITING状态。而BLOCKED状态则是线程在准备进入某个同步代码块时,发现锁对象已经被其它线程占用了,这时线程就会进入BLOCKED状态。
接下来是一些注意点:
-
wait和notify方法要在同步块中调用(防止wait的线程没有接收到其他线程发送的notify消息),wait会释放锁,但notify方法并不会真正释放锁,必须等到它所在的同步代码块执行完毕才能完成锁对象的释放。
- sleep方法不必在同步块中调用,而且sleep方法不会释放锁。(个人理解,sleep方法需要时间参数,到达指定时间后线程自动苏醒,所以不需要类似wait那样的严格要求)
- join方法底层使用wait方法,并且join方法本身就是同步方法(锁对象是调用join方法的线程本身),所以和sleep一样不必在同步块调用,并且jvm在关闭线程之前会检测线阻塞在线程锁对象上的其它线程,然后执行notifyAll(),这样就实现了唤醒阻塞线程的功能 。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫