线程中调用wait方法和sleep方法,很简单,都进来看看

青山丶 2013-12-23 09:21:29
我刚才在网上搜“wait和sleep的区别”时 发现普遍的帖子都回答道
“sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常。”


但我仔细翻了翻API,发现调用wait方法是需要捕获异常的,而且是与调用sleep方法捕获的异常一样。
这怎么解释呢? 难道是我的API手册出错了,还是网上回答的人脑子都进水了?




看! API上写的跟网上普遍回答的答案不一样~
...全文
346 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
william_yao 2013-12-24
  • 打赏
  • 举报
回复
引用 9 楼 u010134240 的回复:
[quote=引用 7 楼 u010134240 的回复:] [quote=引用 5 楼 yzw19932010 的回复:] 关键的区别是,sleep时,依然抱着锁睡觉! wait时,挂起,进入对象锁的等待线程池中,等待notify或者notifyAll方法的唤醒。这个时候,他舍身取义,忍痛割爱,把锁让给了他人,大无畏的精神让我们感动。 都是有异常的,因为这都属于阻塞式的方法,被打断的话,肯定不爽,不爽就要抛异常。懂了么? 鄙视那些胡乱copy的大傻逼!
wait后在等待池阻塞,被其它线程通知后进入对象的锁池阻塞。应该是这样吧~[/quote] 然后呢,等唤醒它的那个线程释放出对象锁后,在锁池阻塞的线程会进入Runnable(可运行)状态,与其它可运行状态的线程一起竞争CPU资源。[/quote] 惭愧了,确实有点错误。 正确的流程应该是,调用wait方法后,进入阻塞对象的等待池等待。 当有notify,notifyAll方法在此对象上调用时,阻塞线程会从阻塞对象的等待池到锁池等待获取锁并进入到可运行状态(Runnable)。 对我的错误表示歉意。
青山丶 2013-12-23
  • 打赏
  • 举报
回复
引用 7 楼 u010134240 的回复:
[quote=引用 5 楼 yzw19932010 的回复:] 关键的区别是,sleep时,依然抱着锁睡觉! wait时,挂起,进入对象锁的等待线程池中,等待notify或者notifyAll方法的唤醒。这个时候,他舍身取义,忍痛割爱,把锁让给了他人,大无畏的精神让我们感动。 都是有异常的,因为这都属于阻塞式的方法,被打断的话,肯定不爽,不爽就要抛异常。懂了么? 鄙视那些胡乱copy的大傻逼!
wait后在等待池阻塞,被其它线程通知后进入对象的锁池阻塞。应该是这样吧~[/quote] 然后呢,等唤醒它的那个线程释放出对象锁后,在锁池阻塞的线程会进入Runnable(可运行)状态,与其它可运行状态的线程一起竞争CPU资源。
青山丶 2013-12-23
  • 打赏
  • 举报
回复
引用 5 楼 yzw19932010 的回复:
关键的区别是,sleep时,依然抱着锁睡觉! wait时,挂起,进入对象锁的等待线程池中,等待notify或者notifyAll方法的唤醒。这个时候,他舍身取义,忍痛割爱,把锁让给了他人,大无畏的精神让我们感动。 都是有异常的,因为这都属于阻塞式的方法,被打断的话,肯定不爽,不爽就要抛异常。懂了么? 鄙视那些胡乱copy的大傻逼!
wait后在等待池阻塞,被其它线程通知后进入对象的锁池阻塞。应该是这样吧~
shapefire 2013-12-23
  • 打赏
  • 举报
回复
引用 5 楼 yzw19932010 的回复:
关键的区别是,sleep时,依然抱着锁睡觉! wait时,挂起,进入对象锁的等待线程池中,等待notify或者notifyAll方法的唤醒。这个时候,他舍身取义,忍痛割爱,把锁让给了他人,大无畏的精神让我们感动。 都是有异常的,因为这都属于阻塞式的方法,被打断的话,肯定不爽,不爽就要抛异常。懂了么? 鄙视那些胡乱copy的大傻逼!
精辟啊
william_yao 2013-12-23
  • 打赏
  • 举报
回复
关键的区别是,sleep时,依然抱着锁睡觉! wait时,挂起,进入对象锁的等待线程池中,等待notify或者notifyAll方法的唤醒。这个时候,他舍身取义,忍痛割爱,把锁让给了他人,大无畏的精神让我们感动。 都是有异常的,因为这都属于阻塞式的方法,被打断的话,肯定不爽,不爽就要抛异常。懂了么? 鄙视那些胡乱copy的大傻逼!
俺是小王子 2013-12-23
  • 打赏
  • 举报
回复
以API和自己实际写的代码为准啊。。。不抛异常编译通不过吧。。。
ifvlr 2013-12-23
  • 打赏
  • 举报
回复
您在哪里看到的呢?我看到的都是要捕获异常啊,而且wait还要用sychronized进行同步监视的。
genganpeng 2013-12-23
  • 打赏
  • 举报
回复
以标准的API就行了
WayneXuan 2013-12-23
  • 打赏
  • 举报
回复
不是脑子进水了,是没动脑子就copy,paste了

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧