关于sleep() 方法和 wait()方法的区别

Java中sleep和wait的区别

1. 这两个方法来自 不同的类 分别是,sleep()来自Thread类,和wait()来自Object类。

sleep()是Thread的静态类方法, 谁调用的谁去睡觉,即使在a线程里调用b的sleep()方法,实际上还是a去睡觉, 要让b线程睡觉要在b的代码中调用sleep()。sleep()方法会一直持有锁,不会释放锁。sleep通常被用于暂停执行。

static void sleep(long millis)
在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。
static void sleep(long millism,int nanos)
在指定的毫秒数加指定的纳秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。

wait是Object的方法 ,被final 修饰表示该方法不能被子类重写,调用此方法 释放当前所持有的对象锁,该线程便会进入该对象的等待池,等待后续被唤醒去获得此对象的锁,等待池中的线程不会去竞争该对象的锁。wait 通常被用于线程间交互。
void wait()
在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。
void wait(long timeout)
在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量前,导致当前线程等待。
void wait(long timeout,int nanos)
在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量前,导致当前线程等待。


2.锁: 最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。

sleep不让出系统资源;wait是进入线程等待池等待,出让系统资源,其他线程可以占用CPU。一般wait不会加时间限制,因为如果wait线程的运行资源不够,再出来也没用,要等待其他线程调用notify/notifyAll唤醒等待池中的所有线程,才会进入就绪队列等待OS分配系统资源。sleep(milliseconds)可以用时间指定使它自动唤醒过来,如果时间不到只能调用interrupt()强行打断。
Thread.sleep(0)的作用是“触发操作系统立刻重新进行一次CPU竞争”。


3.使用范围 notify和notifyAll只能在同步方法或者同步代码块里面使用,而sleep可以在任何地方使用。

原因:如果调用某个对象的wait()方法,当前线程必须拥有这个对象的锁 ,否则的话会抛出IllegalMonitorStateException 异常。所以wait方法必须要在synchronized 方法或同步代码块中执行
调用某个对象的wait()方法,相当于让当前线程交出此对象的monitor,然后进入等待状态,等待后续再次获得此对象的锁。

wait() sleep() 都要对异常进行处理 捕获或者抛出
Unhandled exception: java.lang.InterruptedException
在这里插入图片描述
在这里插入图片描述

发布了26 篇原创文章 · 获赞 10 · 访问量 6504

猜你喜欢

转载自blog.csdn.net/qq_40806970/article/details/100023636