标签:基类 导致 准备 区别 执行 而且 锁对象 定义 同步代码块
一、什么是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()方法就已经进行了抛异常处理。
标签:基类 导致 准备 区别 执行 而且 锁对象 定义 同步代码块
原文地址:https://www.cnblogs.com/l199616j/p/11576796.html