sleep() 和 wait()的区别?
sleep()
sleep()方法是线程类(Thread) 的静态方法,让调用线程进入睡眠状态,让出执行机会给其他线程,等到休眠时间结束后进入就绪状态和其他线程一起竞争cpu的执行时间
因为sleep()是static静态的方法。他不能改变对象的机锁,当一个synchronized块中调用了sleep() 方法,线程虽然进入休眠,但是对象的机锁没有被释放,其他线程依然无法访问这个对象。
wait()
wait()方法是Object类的方法,它就进入到等待池中,同时释放对象的锁(使得其他线程能够访问),可以通过notifyAll方法和notify来唤醒线程。
锁池:假设线程A已经拥有了某个对象(注意:不是类)的锁,而其它的线程想要调用这个对象的某个synchronized方法(或者synchronized块),由于这些线程在进入对象的synchronized方法之前必须先获得该对象的锁的拥有权,但是该对象的锁目前正被线程A拥有,所以这些线程就进入了该对象的锁池中(锁池就是AQS队列)。
等待池:假设一个线程A调用了某个对象的wait()方法,线程A就会释放该对象的锁后,进入到了该对象的等待池中(等待池就是WaitQueue队列))
然后再来说notify和notifyAll的区别
如果线程调用了对象的 wait()方法,那么线程便会处于该对象的等待池中,等待池中的线程不会去竞争该对象的锁。
当有线程调用了对象的 notifyAll()方法(唤醒所有 wait 线程)或 notify()方法(只随机唤醒一个 wait 线程),被唤醒的的线程便会进入该对象的锁池中,锁池中的线程会去竞争该对象锁。也就是说,调用了notify后只要一个线程会由等待池进入锁池,而notifyAll会将该对象等待池内的所有线程移动到锁池中,等待锁竞争
wait()和sleep()的区别?
两者都可以暂停线程的执行。sleep()方法属于Thread类中的,而wait()方法属于Object类中。
sleep通常用于暂停执行,wait通常被用于线程间交互/通信,
sleep()方法导致了程序暂停执行指定的时间,让出CPU该其他线程,但监控状态依旧保持。
调用sleep()方法,线程不会释放锁,调用wait(),线程会放弃锁
sleep()必须捕获异常,而wait,notify和notifyAll不需要捕获异常
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通