sleep()方法和wait()方法都成产生让当前运行的线程停止运行的效果,这是它们的共同点。下面我们来详细说说它们的不同之处。
sleep()方法是本地方法,属于Thread类,它有两种定义:
- [java] view plaincopyprint?
- 01.public static native void sleep(long millis) throws InterruptedException;
- 02.public static void sleep(long millis, int nanos) throws InterruptedException {
- 03. //other code
- 04.}
复制代码 其中的参数millis代表毫秒数(千分之一秒),nanos代表纳秒数(十亿分之一秒)。这两个方法都可以让调用它的线程沉睡(停止运行)指定的时间,到了这个时间,线程就会自动醒来,变为可运行状态(RUNNABLE),但这并不表示它马上就会被运行,因为线程调度机制恢复线程的运行也需要时间。调用sleep()方法并不会让线程释放它所持有的同步锁;而且在这期间它也不会阻碍其它线程的运行。上面的连个方法都声明抛出一个InterruptedException类型的异常,这是因为线程在sleep()期间,有可能被持有它的引用的其它线程调用它的interrupt()方法而中断。中断一个线程会导致一个InterruptedException异常的产生,如果你的程序不捕获这个异常,线程就会异常终止,进入TERMINATED状态,如果你的程序捕获了这个异常,那么程序就会继续执行catch语句块(可能还有finally语句块)以及以后的代码。
为了更好地理解interrupt()效果,我们来看一下下面这个例子:- [java] view plaincopyprint?
- 01.public class InterruptTest {
- 02. public static void main(String[] args) {
- 03. Thread t = new Thread() {
- 04. public void run() {
- 05. try {
- 06. System.out.println("我被执行了-在sleep()方法前");
- 07. // 停止运行10分钟
- 08. Thread.sleep(1000 * 60 * 60 * 10);
- 09. System.out.println("我被执行了-在sleep()方法后");
- 10. } catch (InterruptedException e) {
- 11. System.out.println("我被执行了-在catch语句块中");
- 12. }
- 13. System.out.println("我被执行了-在try{}语句块后");
- 14. }
- 15. };
- 16. // 启动线程
- 17. t.start();
- 18. // 在sleep()结束前中断它
- 19. t.interrupt();
- 20. }
- 21.}
复制代码 运行结果:
- 我被执行了-在sleep()方法前
- 我被执行了-在catch语句块中
- 我被执行了-在try{}语句块后
wait()方法也是本地方法,属于Object类,有三个定义:
- [java] view plaincopyprint?
- 01.public final void wait() throws InterruptedException {
- 02. //do something
- 03.}
- 04.public final native void wait(long timeout) throws InterruptedException;
- 05.public final void wait(long timeout, int nanos) throws InterruptedException {
- 06. //do something
- 07.}
复制代码 wari()和wait(long timeout,int nanos)方法都是基于wait(long timeout)方法实现的。同样地,timeout代表毫秒数,nanos代表纳秒数。当调用了某个对象的wait()方法时,当前运行的线程就会转入等待状态(WAITING),等待别的线程再次调用这个对象的notify()或者notifyAll()方法(这两个方法也是本地方法)唤醒它,或者到了指定的最大等待时间,线程自动醒来。如果线程拥有某个或某些对象的同步锁,那么在调用了wait()后,这个线程就会释放它持有的所有同步资源,而不限于这个被调用了wait()方法的对象。wait()方法同样会被Thread类的interrupt()方法中断,并产生一个InterruptedException异常,效果同sleep()方法被中断一样。
|