人生三从境界:昨夜西风凋碧树,独上高楼,望尽天涯路。 衣带渐宽终不悔,为伊消得人憔悴。 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。

一、什么是sleep()?

  sleep()是Thread类的方法,导致线程暂停执行的时间,给其他线程执行机会,但是依然保持监控状态,过了指定时间会自动恢复执行,调用sleep()方法不会释放锁对象。

当调用sleep()方法后,当前线程进入阻塞状态。目的是让出cpu给其他线程运行的机会。但是由于sleep方法不会释放锁对象,所以在一个同步代码块中调用这个方法后,线程虽然休眠了,但其他线程无法访问他的锁对象。这是因为sleep方法拥有cpu的执行权,他可以自动醒来无需唤醒。而当sleep结束指定休眠时间后,这个线程不一定立即执行,因为此时其他线程可能正在运行。

二、什么是wait()?

  wait方法是object类里的方法,当一个线程执行到wait方法时,它就进入到一个和该对象相关的线程池中,同时释放了锁对象,等待期间可以调用里面的同步方法,其他线程可以访问,等待时不拥有cpu的执行权,否则其他线程无法获取执行权。当一个线程执行了wait方法后,必须调用notify或者notifyAll方法才能唤醒,而且是随机唤醒,若是被其他线程抢到了cpu执行权,该线程会继续进入等待状态。由于锁对象可以是任意对象,所以wait方法必须定义在Object类中,因为Object类是所有类的基类。

 

三、总结sleep()和wait()的区别

  1.sleep()是Thread类中的静态方法,wait()是Object超类中定义的成员方法,因此sleep()可以在任何地方使用,而wait()只能在同步方法或者同步代码块中使用。

  2.sleep()方法必须传一个时间参数,而wait()可传可不传

  3.sleep()方法导致了程序暂停执行的时间,让出cpu给其他线程,但是他的监控状态依然保持着,当指定的时间到了又会自动恢复运行状态。在调用sleep()方法的过程中,线程不会释放对象锁。

而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有支队此对象调用notify()方法后本线程才进入对象锁定池准备。

   4.sleep()方法需要抛出异常,wait方法不需要,why?

因为Thread类中的sleep()方法就已经进行了抛异常处理。

posted on 2019-10-01 13:48  测试开发喵  阅读(527)  评论(0编辑  收藏  举报