sleep和wait的区别,wait需要抛出异常吗?

1、sleep()函数在Thread类中,wait()函数属于Object类,源码如下:
在这里插入图片描述在这里插入图片描述
sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在a线程里调用了b的sleep方法,实际上还是a去睡觉,要让b线程睡觉要在b的代码中调用sleep。

2、最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。

sleep不出让系统资源;wait是进入线程等待池等待,出让系统资源,其他线程可以占用CPU。一般wait不会加时间限制,因为如果wait线程的运行资源不够,再出来也没用,要等待其他线程调用notify/notifyAll唤醒等待池中的所有线程,才会进入就绪队列等待OS分配系统资源。sleep(milliseconds)可以用时间指定使它自动唤醒过来,如果时间不到只能调用interrupt()强行打断。sleep(100L)是占用cpu,线程休眠100毫秒,其他进程不能再占用cpu资源,wait(100L)是进入等待池中等待,交出cpu等系统资源供其他进程使用,在这100毫秒中,该线程可以被其他线程notify,但不同的是其他在等待池中的线程不被notify不会出来,但这个线程在等待100毫秒后会自动进入就绪队列等待系统分配资源,换句话说,sleep(100)在100毫秒后肯定会运行,但wait在100毫秒后还有等待os调用分配资源,所以wait100的停止运行时间是不确定的,但至少是100毫秒。就是说sleep有时间限制的就像闹钟一样到时候就叫了,而wait是无限期的除非用户主动notify。

Thread.Sleep(0)的作用是“触发操作系统立刻重新进行一次CPU竞争”。

3、使用范围:wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用
synchronized(x){
x.notify()
//或者wait()
}

4、sleep必须捕获异常,wait也需要捕获异常(网上非常多的代码说不用抛出异常,应该是没去看源码和尝试吧,下面附图,其实文章上一张源码的图也显示需要抛出异常),notify和notifyAll不需要捕获异常。

在这里插入图片描述

如果对象调用了wait方法就会使持有该对象的线程把该对象的控制权交出去,然后处于等待状态。wait:线程自动释放其占有的对象锁,并等待notify。
如果对象调用了notify方法就会通知某个正在等待这个对象的控制权的线程可以继续运行。notify:唤醒一个正在wait当前对象锁的线程,并让它拿到对象锁。
如果对象调用了notifyAll方法就会通知所有等待这个对象控制权的线程继续运行。notifyAll:唤醒所有正在wait前对象锁的线程。

notify和notifyAll的区别是:notify只是唤醒一个正在wait当前对象锁的线程,而notifyAll唤醒所有。notify是本地方法,具体唤醒哪一个线程由虚拟机控制;notifyAll后并不是所有的线程都能马上往下执行,它们只是跳出了wait状态,接下来它们还会是竞争对象锁。

这儿要非常注意的几个事实:

任何一个时刻,对象的控制权(monitor)只能被一个线程拥有。
无论是执行对象的wait、notify还是notifyAll方法,必须保证当前运行的线程取得了该对象的控制权(monitor)
如果在没有控制权的线程里执行对象的以上三种方法,就会报java.lang.IllegalMonitorStateException异常。

基于以上几点事实,我们需要确保让线程拥有对象的控制权,线程取得控制权的方法有三:

执行对象的某个同步实例方法。
执行对象对应类的同步静态方法。
执行对该对象加同步锁的同步块。

一句话:
sleep 是 Thread 的静态方法,可以在任何地方调用;wait 是 Object 的成员方法,只能在 synchronized 代码块中调用,否则会报 IllegalMonitorStateException 非法监控状态异常; sleep 不会释放共享资源锁,wait 会释放共享资源锁。

图片来自:,额,找不到人了
在这里插入图片描述

继续学点?

Java多线程学习之wait、notify/notifyAll 详解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值