线程中sleep()和wait()的区别

sleep()和wait()的区别

sleep()

sleep()方法是Thread的静态方法,提供了两种sleep的方式可让我们更灵活的控制,目的是为了使线程睡眠一段时间,自然醒后继续执行,不存在继续竞争,因为期间并没有释放同步锁.

public static native void sleep(long millis) throws InterruptedException;

public static void sleep(long millis, int nanos)

    throws InterruptedException {

        if (millis < 0) {

            throw new IllegalArgumentException("timeout value is negative");

        }



        if (nanos < 0 || nanos > 999999) {

            throw new IllegalArgumentException(

                                "nanosecond timeout value out of range");

        }



        if (nanos >= 500000 || (nanos != 0 && millis == 0)) {

            millis++;

        }



        sleep(millis);

    }

wait()

来看源码,我们可以看见wait()是Object内的方法,也就是每个类都继承了这个方法,每个对象都可以调研,final修饰的并不能重载只能间接调用父类Object的。

public final void wait() throws InterruptedException {

        wait(0);

    }

public final native void wait(long timeout) throws InterruptedException;

public final void wait(long timeout, int nanos) throws InterruptedException {

 

顺便看一下notify和notifyAll方法,发现也是Object的原生的无法重写的方法

public final native void notify();//随机唤醒一个等待的线程

public final native void notifyAll();//唤醒所以等待执行的线程

拓展:阻塞或唤醒一个Java线程需要操作系统切换CPU状态来完成,这种状态转换需要耗费处理器时间。

 

总结

  1.sleep(long millis)是Thread的静态方法,用于为线程指定睡眠时间,期间并不释放同步锁,时间到达后恢复线程执行;wait()是Object的final方法,会把调用者线程挂起,同时释放锁,直到被notify/notifyAll等方法唤醒或者超时,之后和其它线程共同竞争CPU。

  2.最主要是sleep()不释放同步锁,而wait()释放同步锁,使得其他线程可以使用同步控制块或者方法。

  3.wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用。

   4.sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常。

 

参考:https://blog.csdn.net/xyh269/article/details/52613507

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/qq_40531768/article/details/89306532