wait、sleep、notify、notifyAll的区别
来源:互联网 发布:知乎精选 编辑:程序博客网 时间:2024/05/29 07:44
Wait是Object类的方法,范围是使该Object实例所处的线程。
Sleep()是Thread类专属的静态方法,针对一个特定的线程。
Wait方法使实体所处线程暂停执行,从而使对象进入等待状态,直到被notify方法通知或者wait的等待的时间到。Sleep方法使持有的线程暂停运行,从而使线程进入休眠状态,直到用interrupt方法来打断他的休眠或者sleep的休眠的时间到。Wait方法进入等待状态时会释放同步锁(如上例中的lock对象),而Sleep方法不会释放同步锁。所以,当一个线程无限Sleep时又没有任何人去interrupt它的时候,程序就产生大麻烦了notify是用来通知线程,但在notify之前线程是需要获得lock的。另个意思就是必须写在synchronized(lockobj) {...}之中。wait也是这个样子,一个线程需要释放某个lock,也是在其获得lock情况下才能够释放,所以wait也需要放在synchronized(lockobj) {...}之中。
Sleep与interrupt
interrupt是个很暴力的方法,打断一个线程的Sleep时并不需要获得该线程的lock。虽然暴力却也有暴力的用处。在一个线程无时限sleep的时候也只有interrupt能够唤醒他。在interrupt的时候会抛出InterruptedException,这个Exception是由Thread 类自动抛出的。因此Interrupt带有强烈的阻塞味道。
wait与interrupt
interrupt同样可以打断wait的等待,与打断sleep不同的是,被打断的wait的线程在重新获得lock之前是不会抛出InterruptedException。
resume和suspend已经被Java遗弃,因为他们天生会引起线程的死锁。
suspend是个贪婪的家伙,当一个线程在suspend的时候,线程会停下来,但却仍然持有在这之前获得的锁定。其他线程无法使用他锁定的任何资源,除非这个挂起的线程被resume之后,他才会继续运行。对于线程的同步,使用wait与notify要安全的多。
- wait、sleep、notify、notifyAll的区别
- wait、sleep、notify、notifyAll的区别
- wait、sleep、notify、notifyAll的区别
- wait、sleep、notify、notifyAll的区别
- wait、sleep、notify、notifyAll的区别
- wait(),notify(),notifyAll()及sleep() 和wait()的区别
- wait(),notify(),notifyAll()及sleep() 和wait()的区别
- sleep,yield,join,notify,wait,notifyAll区别
- sleep & wait | notify | notifyAll
- sleep & wait | notify | notifyAll
- wait,notify,notifyAll,sleep
- (四)wait()、notify()、notifyAll()方法||wait()与sleep()的区别
- sleep synchronized wait notify notifyAll
- synchronized,sleep,wait,notify,notifyAll
- Java:sleep、wait、notify、notifyAll
- 多线程wait-notify;notifyall.sleep
- wait|notify|notifyAll|sleep|volatile
- wait, sleep, notify, notifyall, join
- unity3d-C#集合和范型
- Android客户端与服务器端RSA加密通讯加密字符不一致相关问题
- CRAN Task View:Empirical Finance
- SVN(CollabNetSubversionEdge)的备份及恢复方法
- 事务基础知识-->Spring事务管理
- wait、sleep、notify、notifyAll的区别
- 常用符号英文
- Android环境配置
- BoneCP 在 Spring + Hibernate 中的配置
- ColorMatrix 对比度 亮度 黑白 效果
- TextWatcher实现输入关键字筛选数据
- “爱加密” 动态脱壳法
- Android开发使用google地图申请api key(v2.API_KEY)
- 泛型二