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

本文详细对比了Java线程中sleep()与wait()方法的功能、区别、使用场景及注意事项。重点阐述了两者在是否释放锁、使用范围、异常处理等方面的差异,帮助开发者在实际开发中合理选择并应用这些方法。

1、来源不同:

     sleep()方法来自于 Thread 类的一个静态方法, 只有继承了线程类的子类才能调用该方法,且谁调用的谁去睡觉,即使在 A 线程里调用了 B 的sleep方法,实际上还是 A 去睡觉,要让 B 线程睡觉要在 B 的代码中调用sleep。

1 static void sleep(long millis);  //在指定的毫秒数内对当前正在执行的线程进行休眠操作
2 static void sleep(long millis,  int nanos);  //在指定的毫秒加纳秒内对当前执行线程进行休眠操作

   wait()方法来自于 Object 类,Object类所有Java类的祖先。所以任何一个类都可以调用wait()方法。

1 void wait();  //在其他线程调用此对象的notify()方法或notifyAll()方法前,导致当前线程等待
2 void wait(long timeout);  //在其他线程调用此对象的notify()方法或notifyAll()方法,或者超过指定的时间量前,导致该线程等待
3 void wait(long timeout, int nanos); //在其他线程对用此对象的notify()方法或notifyAll()方法,或者其他某个线程终端当前线程,或者已超出某个实际时间量前,当前线程等待

 

2、最主要sleep()方法没有释放锁,而 wait() 方法释放了锁,使得其他线程可以使用同步控制块或者方法。就如同蹲坑,就算在马桶上睡着了也不让出这个坑,你睡醒了还可以继续,这就是sleep();拉到一半被boss换出去,让出资源,这就是wait(),决定你再次蹲上这个坑的是boss的唤醒。

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

Thread.Sleep(0)的作用是“触发操作系统立刻重新进行一次CPU竞争”。


3、使用范围:wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用

   synchronized(x){
      x.notify();
     //或者wait()
   }

 


4、sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常

 

转载于:https://www.cnblogs.com/liujianli405/p/3845073.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值