Java中Wait、Sleep和Yield方法的区别
sleep() | yield() | wait() |
---|---|---|
定义在Thread类中 | 定义在Thread类中 | 定义在Object类中 |
用于短时间暂停当前线程 | 用于线程间通信 | |
不会释放他所持有的管程 | 仅仅释放线程所占有的CPU资源 | 释放它持有的对象的管程和锁 |
Java中的sleep方法不需要在同步代码块中调用 | Java中的wait方法应在同步代码块中调用 | |
sleep()方法是一个静态方法 | wait方法是一个实例方法,只能在其他线程调用本实例的notify()方法时被唤醒 | |
唤醒之后会立即进入就绪态 | 首先获得锁(阻塞态),然后再进入就绪态 | |
sleep仅仅让你的线程进入睡眠状态 | wait通常有条件地执行 | |
sleep是针对一个线程 | 针对一个被同步代码块加锁的对象 | |
yield方法会临时暂停当前正在执行的线程, 不保证当前的线程会暂停或者停止, 但是可以保证当前线程在调用yield方法时会放弃CPU |
sleep(long millis)
sleep(long millis, int nanos)
下面这张图很好地展示了在调用wait、sleep、yield方法的时候,线程状态如何转换。
Java中sleep方法的几个注意点:
- Thread.sleep()方法用来暂停线程的执行,将CPU放给线程调度器。
- Thread.sleep()方法是一个静态方法,它暂停的是当前执行的线程。
- Java有两种sleep方法,一个只有一个毫秒参数,另一个有毫秒和纳秒两个参数。
- 与wait方法不同,sleep方法不会释放锁
- 如果其他的线程中断了一个休眠的线程,sleep方法会抛出Interrupted Exception。
- 休眠的线程在唤醒之后不保证能获取到CPU,它会先进入就绪态,与其他线程竞争CPU。
- 有一个易错的地方,当调用t.sleep()的时候,会暂停线程t。这是不对的,因为Thread.sleep是一个静态方法,它会使当前线程而不是线程t进入休眠状态。
这就是java中的sleep方法。我们已经看到了java中sleep、wait以及yield方法的区别。总之,记住sleep和yield作用于当前线程。