sleep与wait
-
sleep方法没有释放锁,而wait方法释放了锁
-
wait需要其他线程调用对象的notify()或者notifyAll()方法来唤醒,sleep可以自动换醒(超时),
-
wait方法定义在Object类中,作用于对象本身;sleep方法定义在java.lang.Thread中,作用于当前线程
-
只能在同步上下文中调用wait方法,否则或抛出IllegalMonitorStateException异常,sleep不需要在同步方法或同步块中调用
-
wait是实例方法,sleep是静态方法
wait 与yield
wait 方法是属于 Object 类中的,wait 过程中线程会释放对象锁,只有当其他线程调用 notify 才能唤醒此线程。wait 使用时必须先获取对象锁,即必须在 synchronized 修饰的代码块中使用,那么相应的 notify 方法同样必须在 synchronized 修饰的代码块中使用,如果没有在synchronized 修饰的代码块中使用时运行时会抛出IllegalMonitorStateException的异常
yield和 sleep 一样都是 Thread 类的方法,都是暂停当前正在执行的线程对象,不会释放资源锁,和 sleep 不同的是 yield方法并不会让线程进入阻塞状态,而是让线程重回就绪状态,它只需要等待重新获取CPU执行时间,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行。还有一点和 sleep 不同的是 yield 方法只能使同优先级或更高优先级的线程有执行的机会