wait和sleep的区别

sleep()方法:

功能:
sleep()方法是Thread类的方法,线程通过调用该方法,进入休眠状态主动让出CPU,从而CPU可以执行其他的线程。
经过sleep指定的时间后,CPU回到这个线程上继续往下执行。

如何当前线程进入了同步锁,sleep()方法并不会释放锁。
即使当前线程使用sleep方法让出了cpu,但其他被同步锁挡住了的线程也无法得到执行。

注意:

如果线程在休眠时被打断,JVM就会抛出InterruptedException异常。因此,必须在try-catch语句块中调用sleep方法。

wait()方法:

wait()方法可以中断线程的运行,使本线程等待,暂时让出CPU的使用权,并允许其他线程使用这个同步方法。
其他线程如果在使用这个同步方法时不需要等待,那么它使用完这个方法的同时,
应该用notifyAll()方法通知所有由于使用了这个同步方法而处于等待的线程结束等待,
曾中断的线程就会从刚才中断处继续执行这个同步方法(并不是立马执行,而是结束等待),
并遵循“先中断先继续”的原则。

wait是指在一个已经进入了同步锁的线程内,让自己暂时让出同步锁,以便其他正在等待此锁的线程可以得到同步锁并运行,只有其他线程调用了notify方法(notify并不释放锁,只是告诉调用过wait方法的线程可以去参与获得锁的竞争了,但不是马上得到锁,因为锁还在别人手里,别人还没释放。如果notify方法后面的代码还有很多,需要这些代码执行完后才会释放锁,可以在notfiy方法后增加一个等待和一些代码,看看效果)

sleep和wait的区别:

  1. sleep是Thread的静态方法,而wait是Object的成员方法
  2. sleep没有synchronized的作用域也会运行,而wait方法必须要在synchronized的作用域下运行,否则就会报IllegalMonitorStateException异常,就是非法监控状态异常(不能再lock锁下用wait)
  3. sleep不会释放锁,wait会释放锁,notify不会释放锁 (notify并不释放锁,只是告诉调用过wait方法的线程可以去参与获得锁的竞争了,但不是马上得到锁,因为锁还在别人手里,别人还没释放。如果notify方法后面的代码还有很多,需要这些代码执行完后才会释放锁)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值