【Android每日一问】sleep,wait,yield,join介绍以及区别

787 阅读2分钟

Sleep

Thread类的方法,必须带一个时间参数,会让当前线程休眠进入阻塞状态并释放CPU资源,提供其他线程运行的机会且不考虑优先级,但如果有同步锁则Sleep不会释放锁,即其他线程无法获得同步锁,可通过interrupt()方法来唤醒休眠线程。

yield

Thread类的方法,让出CPU调度,类似Sleep只是不能由用户指定暂停多长时间,并且yield()方法只能让同优先级的线程有执行的机会,yield()只是使当前线程重新回到可执行状态,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行。调用yield方法只是一个建议,告诉线程调度器我的工作已经做的差不多了,可以让别的相同优先级的线程使用CPU了,没有任何机制保证采纳。

wait

Object类的方法(notify()、notifyAll() 也是Object对象),必须放在循环体和同步代码块中,执行该方法的线程会释放锁,进入线程等待池中等待被再次唤醒(notify随机唤醒,notifyAll全部唤醒,线程结束自动唤醒)即放入锁池中竞争同步锁。

  • wait()方法使当前线程暂停执行并释放对象锁标志,让其他线程可以进入Synchronized数据块,当前线程被放入对象等待池中。
  • 当调用 notify()方法后,将从线程的等待池中移走一个任意的线程并放到锁标志等待池中,只有锁标志等待池中的线程能够获取锁标志;如果锁标志等待池中没有线程,则notify()不起作用。
  • notifyAll()则从线程等待池中移走所有等待那个对象的线程并放到锁标志等待池中。

join

一种特殊的wait,当前运行线程调用另一个线程的join方法,当前线程进入阻塞状态直到另一个线程运行结束等待该线程终止。 注意该方法也需要捕捉异常。等待调用join方法的线程结束,再继续执行。

wait和sleep的区别

  • sleep是线程方法,wait是object方法。
  • sleep ,释放cpu资源,不释放锁资源,如果线程进入sleep的话,释放cpu资源,如果外层包有Synchronize,那么此锁并没有释放掉。
  • wait 释放cpu资源,也释放锁资源,一般用于锁机制中 肯定是要释放掉锁的,因为notify并不会立即调起此线程,因此cpu是不会为其分配时间片的,也就是说wait线程进入等待池,cpu不分时间片给它,锁释放掉。