本文介绍Java中sleep和wait方法的使用区别
文章目录
- sleep()
- wait()
- sleep()和wait()对比
- 区别
- 相同点
sleep()
查看sleep方法,可见其是static native方法
public static native void sleep(long millis) throws InterruptedException;
sleep()方法需要指定等待的时间
。
它可以让当前正在执行的线程在指定的时间内暂停执行,进入阻塞状态,该方法既可以让其他同优先级或者高优先级的线程得到执行的机会,也可以让低优先级的线程得到执行机会。
但是sleep()方法不会释放“锁标志”
,也就是说如果有synchronized同步块,其他线程仍然不能访问共享数据。
wait()
public final native void wait(long timeout) throws InterruptedException;
wait()方法会释放对象的“锁标志”。
当调用某一对象的wait()方法后,会使当前线程暂停执行,并将当前线程放入对象等待池中,直到调用了notify()方法后,将从对象等待池中移出任意一个线程
并放入锁标志等待池
中,只有锁标志等待池中的线程可以获取锁标志,它们随时准备争夺锁的拥有权。
当调用了某个对象的notifyAll()方法,会将对象等待池中的所有线程都移动到该对象的锁标志等待池。
notify() 只能保证在通知时间点,条件是满足的。而被通知线程的执行时间点和通知的时间点基本上不会重合,所以当线程执行的时候,很可能条件已经不满足了(保不齐有其他线程插队)。
尽量使用 notifyAll()
notify() 是会随机地通知
等待队列中的一个线程,而 notifyAll() 会通知等待队列中的所有线程
。从感觉上来讲,应该是 notify() 更好一些,因为即便通知所有线程,也只有一个线程能够进入临界区。
但那所谓的感觉往往都蕴藏着风险,实际上使用 notify() 也很有风险,它的风险在于可能导致某些线程永远不会被通知到。
sleep()和wait()对比
区别
wait与sleep区别在于:
wait会释放所有锁,而sleep不会释放锁资源.
wait只能在同步方法和同步块中使用,而sleep任何地方都可以.
- sleep是Thread的静态方法,wait是Object的方法,任何对象实例都能调用。
相同点
两者相同点:都会让渡CPU执行时间
,等待再次调度!