wait和sleep区别:

  • wait()方法必须在synchronized同步块或方法中
  • wait()方法会释放由synchronized锁上的对象锁,而sleep()则不会
  • 由wait()方法形成的阻塞,可以通过针对同一个对象锁的synchronized作用域调用notify/notifyAll来唤醒;
  • 而sleep()则无法被“唤醒”,其只能定时醒来或被interrupt()方法中断

 

sleep和yield区别:

  • 执行sleep()方法后转入阻塞(BLOCKED)状态,并在“睡眠”一段时间后自动“醒来”,回到就绪(RUNNABLE)状态。
  • 而执行yield()方法后,当前线程转入的是就绪(RUNNABLE)
  • 当前线程执行sleep()方法后,其他线程无论优先级高级,都有机会得以运行;而执行yield()方法只会给哪些具有相同
  • 优先级或更高优先级的线程运行的机会。
  • sleep()方法需要声明抛出InterruptException,而yield()方法没有声明任何异常
  • sleep()方法比yield()方法具有更好的可移植性。如果在循环中使用yield()方法,则在Linux上容易导致“死循环”,当前线程yield()后总是又立即抢占到cpu,导致其他线程得不到执行。