日期:2014-05-20  浏览次数:20900 次

线程中调用wait方法和sleep方法,很简单,都进来看看
我刚才在网上搜“wait和sleep的区别”时 发现普遍的帖子都回答道
“sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常。”


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




看! API上写的跟网上普遍回答的答案不一样~

------解决方案--------------------
不是脑子进水了,是没动脑子就copy,paste了
------解决方案--------------------
以标准的API就行了
------解决方案--------------------
您在哪里看到的呢?我看到的都是要捕获异常啊,而且wait还要用sychronized进行同步监视的。
------解决方案--------------------
以API和自己实际写的代码为准啊。。。不抛异常编译通不过吧。。。
------解决方案--------------------
关键的区别是,sleep时,依然抱着锁睡觉!

wait时,挂起,进入对象锁的等待线程池中,等待notify或者notifyAll方法的唤醒。这个时候,他舍身取义,忍痛割爱,把锁让给了他人,大无畏的精神让我们感动。

都是有异常的,因为这都属于阻塞式的方法,被打断的话,肯定不爽,不爽就要抛异常。懂了么?

鄙视那些胡乱copy的大傻逼!
------解决方案--------------------
引用:
关键的区别是,sleep时,依然抱着锁睡觉!

wait时,挂起,进入对象锁的等待线程池中,等待notify或者notifyAll方法的唤醒。这个时候,他舍身取义,忍痛割爱,把锁让给了他人,大无畏的精神让我们感动。

都是有异常的,因为这都属于阻塞式的方法,被打断的话,肯定不爽,不爽就要抛异常。懂了么?

鄙视那些胡乱copy的大傻逼!

精辟啊
------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

关键的区别是,sleep时,依然抱着锁睡觉!

wait时,挂起,进入对象锁的等待线程池中,等待notify或者notifyAll方法的唤醒。这个时候,他舍身取义,忍痛割爱,把锁让给了他人,大无畏的精神让我们感动。

都是有异常的,因为这都属于阻塞式的方法,被打断的话,肯定不爽,不爽就要抛异常。懂了么?

鄙视那些胡乱copy的大傻逼!


wait后在等待池阻塞,被其它线程通知后进入对象的锁池阻塞。应该是这样吧~

然后呢,等唤醒它的那个线程释放出对象锁后,在锁池阻塞的线程会进入Runnable(可运行)状态,与其它可运行状态的线程一起竞争CPU资源。

惭愧了,确实有点错误。

正确的流程应该是,调用wait方法后,进入阻塞对象的等待池等待。
当有notify,notifyAll方法在此对象上调用时,阻塞线程会从阻塞对象的等待池到锁池等待获取锁并进入到可运行状态(Runnable)。

对我的错误表示歉意。