wait()与sleep()方法区别

探讨wait()方法与sleep()方法的区别前,我们应该先了解线程的生命周期,即线程的几种状态:

线程的生命周期
下面来具体了解下sleep()和wait()方法的区别:

1.首先,sleep()方法属于Thread类,针对当前进程的,必须捕获异常,调用此方法后当前进程会停止运行一段时间,但不会释放同步锁及其占有的资源,等到sleep()时间到了之后会进入就绪状态,等待获取CPU重新进入运行状态。

2.而wait()方法是Object类的一个方法,不用抛出异常,必须在同步代码块或同步方法中使用它,使用它之后会释放对象持有的锁和占有的资源,并进入等待阻塞池,只能由其它线程通过notify()方法唤醒,唤醒后进入锁定阻塞池,等待获得同步锁后进入就绪状态。

关于wait

为什么一般总是在while循环中使用wait()?
答:因为唤醒处于wait()状态的线程一般有两个方法:notify()和notifyAll()。而由于notify()方法只是随机的唤醒一个线程,所以并不太符合我们的要求,于是我们比较常用的是notifyAll()方法,而这个方法是唤醒所有处于wait()状态的方法,而我们只想唤醒一些具有某种条件的线程,这里就是导致while()和if()的区别了,while()会在线程被唤醒时接着先判断是否满足while()条件,满足的话继续wait(),而if()则是直接向下执行,所以我们应该使用while()而不是if().

关于interrupt()方法

在线程正常执行的时候被调用其interrupt()方法不会有任何影响,只是会修改它的中断位为true,而当线程在进入sleep()/wait()/join()等阻塞状态时,若中断位为true,则线程会抛出相应的异常,只需在catch异常时返回即可结束该进程。


参考:java中sleep和wait的区别

猜你喜欢

转载自blog.csdn.net/Chushiniudao/article/details/83927379