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方法的时候,线程状态如何转换。

img

Java中sleep方法的几个注意点:

  1. Thread.sleep()方法用来暂停线程的执行,将CPU放给线程调度器。
  2. Thread.sleep()方法是一个静态方法,它暂停的是当前执行的线程。
  3. Java有两种sleep方法,一个只有一个毫秒参数,另一个有毫秒和纳秒两个参数。
  4. 与wait方法不同,sleep方法不会释放锁
  5. 如果其他的线程中断了一个休眠的线程,sleep方法会抛出Interrupted Exception。
  6. 休眠的线程在唤醒之后不保证能获取到CPU,它会先进入就绪态,与其他线程竞争CPU。
  7. 有一个易错的地方,当调用t.sleep()的时候,会暂停线程t。这是不对的,因为Thread.sleep是一个静态方法,它会使当前线程而不是线程t进入休眠状态。

这就是java中的sleep方法。我们已经看到了java中sleep、wait以及yield方法的区别。总之,记住sleep和yield作用于当前线程。

原文地址:https://www.cnblogs.com/1605-3QYL/p/12613441.html