Java学习干货:sleep() 和 wait() 有什么区别?notify()和 notifyAll()有什么区别?_java自学_java相关资讯_成都java培训机构

Java学习干货:sleep() 和 wait() 有什么区别?notify()和 notifyAll()有什么区别?

  • 作者:创始人
  • 发表时间:2021-12-22 09:53:00

在大家学习Java过程中会学到各种各样的知识点,那么sleep() 和 wait() 有什么区别?notify()和 notifyAll()有什么区别?

sleep() 和 wait() 有什么区别?

sleep():方法是线程类(Thread)的静态方法,它允许调用线程进入睡眠状态,为其他线程让出执行机会,直到休眠结束,线程进入就绪状态,并与其他线程一起竞争cpu的执行时间。由于sleep()是static静态方法,它无法更改对象的锁,在synchronized块中调用sleep方法时,尽管线程处于休眠状态,但对象的机锁不会被释放,其他线程仍然不能访问该对象。

wait():wait()是Object类的方法,当线程执行到wait方法时,这是一个与这个对象相关的等待池,而当对象的机锁被释放时,其他线程可以通过notify进行访问,notifyAll方法唤醒等待的线程。

sleep() 和 wait() 有什么区别?notify()和 notifyAll()有什么区别?

notify()和 notifyAll()有什么区别?

当一个线程调用一个对象的wait()方法时,这个线程将进入该对象的等待池,并且等待池中的线程将不会与该对象的锁竞争。

如果线程调用了一个对象的notifyAll()方法(唤醒所有wait线程)或notify(仅随机唤醒一个wait线程)方法时,唤醒的线程将进入该对象的锁池,而锁池中的线程将去与该对象锁竞争。这就是说,在调用notify之后,只要一个线程从这个等待池进入锁池,notifyAll就会把等待这个池中的所有线程移入锁池,以等待锁竞争。

如果某个线程不与那个对象锁竞争,那么优先级高的线程就会继续处于锁定池中,那么只有线程再次调用wait()方法,才能返回到等待池。同时,与对象锁竞争的线程继续向下运行,直到synchronized代码块完成后,它将释放这个对象锁,此时锁池中的线程将继续与该对象锁竞争。

sleep() 和 wait() 有什么区别?notify()和 notifyAll()有什么区别?关注知了堂成都Java培训带你了解更多Java相关问题和更多的Java相关知识小干货。