Loading

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不需要捕获异常

posted @ 2022-05-17 22:53  远乡人  阅读(55)  评论(0编辑  收藏  举报