原文: https://howtodoinjava.com/java/multi-threading/sleep-vs-wait/
了解 Java 中sleep()
和wait()
方法之间的区别。 了解何时使用哪种方法以及 Java 并发带来什么效果。
1. Java sleep()
和wait()
– 讨论
sleep()
是一种用于暂停该过程几秒钟或我们想要的时间的方法。 但是,在使用wait()
方法的情况下,线程进入等待状态,直到我们调用notify()
或notifyAll()
时,线程才会自动返回。
主要区别在于,wait()
会释放锁定或监视器,而sleep()
不会在等待期间释放锁定或监视器。 通常,wait()
用于线程间通信,而sleep()
用于引入执行暂停。
Thread.sleep()
将当前线程发送到“不可运行”状态一段时间。 该线程保留已获取的监视器 - 即,如果该线程当前在synchronized
块或方法中,则没有其他线程可以进入该块或方法。 如果另一个线程调用t.interrupt()
。 它将唤醒睡眠线程。
sleep()
是static
方法,这意味着它始终会影响当前线程(正在执行sleep
方法的线程)。 一个常见的错误是在t
是不同线程的情况下调用t.sleep()
。 即使这样,仍将休眠的是当前线程,而不是t
线程。
阅读更多:使用
wait()
和notify()
2. Java sleep()
和wait()
– 示例
synchronized(LOCK) {
Thread.sleep(1000); // LOCK is held
}
synchronized(LOCK)
{
LOCK.wait(); // LOCK is not held
}
阅读更多:
yield()
和join()
之间的区别
3. Java sleep()
和wait()
– 总结
简而言之,让我们对以上所有要点进行分类以记住。
3.1 在…上调用方法
wait()
– 调用对象; 当前线程必须在锁对象上同步。sleep()
– 调用线程; 始终当前正在执行的线程。
3.2 同步
wait()
– 同步多个线程时,一个线程一个对象访问一个对象。sleep()
– 同步时,多个线程等待休眠线程的休眠。
3.3 锁定时间段
wait()
– 释放其他对象有机会执行的锁定。sleep()
– 如果指定了超时或有人中断,请保持锁定至少 t 次。
3.4 唤醒条件
wait()
– 直到从对象调用notify()
,notifyAll()
sleep()
– 直到至少时间到期或调用interrupt()
。
3.5 用法
sleep()
– 用于时间同步wait()
– 用于多线程同步。
希望以上信息将为您的知识库增加一些价值。
学习愉快!