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