Java中Wait、Sleep和Yield方法的区别
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作用于当前线程。

                
            
        
浙公网安备 33010602011771号