zoukankan      html  css  js  c++  java
  • 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作用于当前线程。

  • 相关阅读:
    Kylin 与 Spark SQL相比,有哪些差异和优势?
    apache kylin2.10在原生hadoop集群上安装
    ambari安装 QA
    mysql 5.7 学习
    Public key for ambari-server-2.4.2.0-136.x86_64.rpm is not installed 安装ambari报错总结
    python 练习
    centos 扩容
    Linux中Cache内存占用过高解决办法
    HyperLogLog
    星型模式、雪花模式和事实星座模式
  • 原文地址:https://www.cnblogs.com/1605-3QYL/p/12613441.html
Copyright © 2011-2022 走看看