理解sleep、wait、notify

sleep

  • api文档
理解sleep、wait、notify_第1张图片
image.png
理解sleep、wait、notify_第2张图片
image.png
在指定的毫秒数内**让当前正在执行的线程休眠**(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。该线程不丢失任何监视器的所属权。
  • 理解

    1. Thread类的静态方法。休眠时,仅仅释放CPU资源,不会释放同步锁,可被中断。
    2. InterruptedException:当前线程被中断是抛出此异常,需捕获处理。

yield

  • Thread类的静态方法。
  • Yield是一个静态的原生(native)方法。
  • Yield告诉当前正在执行的线程把运行机会交给线程池中优先级高的线程。
  • 它仅能使一个线程从运行状态转到可运行状态,而不是等待或阻塞状态。
  • 谁能获得CPU完全取决于调度器,在有些情况下调用yield方法的线程甚至会再次得到CPU资源。所以,依赖于yield方法是不可靠的,它只能尽力而为。参考

join

线程实例的方法join()方法可以使得一个线程在另一个线程结束后再执行。如果join()方法在一个线程实例上调用,当前运行着的线程将阻塞直到这个线程实例完成了执行

wait 、notify 、 notifyAll

  • 这三个方法是Object的final方法。可以用 wait、notify 和 notifyAll 来实现线程间的通信。

  • 调用对象的wait方法,该线程就会处于该对象的等待池中,并释放锁。

  • 当其它线程调用该对象的notifyAll()方法(唤醒所有wait线程)或notify()方法(只随机唤醒一个wait线程),被唤醒的的线程便会进入该对象的锁池中,锁池中的线程会去竞争该对象锁。

  • 只能在同步函数或代码块中使用wait、notify和notifyAll,不然Java虚拟机会生成 IllegalMonitorStateException。

  • 永远在while循环里而不是if语句下使用wait。这样,循环会在线程睡眠前后都检查wait的条件,并在条件实际上并未改变的情况下处理唤醒通知。

  • 永远在多线程间共享的对象(在生产者消费者模型里即缓冲区队列)上使用wait。

参考文章

sleep vs wait

  • wait()是用于线程间通信的,而sleep()是用于短时间暂停当前线程。
  • 进入wait状态的线程能够被notify和notifyAll线程唤醒,并且会释放实例对象所持有的锁。sleep不会被唤醒,也不会释放锁。
  • Java中的wait方法应在同步代码块中调用,sleep则没要求。

写在最后,以上内容源于网络及个人总结,若有错误之处,请评论区留言讨论,共勉之。

你可能感兴趣的:(理解sleep、wait、notify)