sleep和wait

  • 1 sleep
  • 2 wait
  • 3 区别、同

1 sleep

每个对象都有一个锁来控制同步访问,Synchronized关键字可以和对象的锁交互,来实现同步方法或同步块。sleep()方法正在执行的线程主动让出CPU(然后CPU就可以去执行其他任务),在sleep指定时间后CPU再回到该线程继续往下执行(注意:sleep方法只让出了CPU,而并不会释放同步资源锁!);

  • sleep() 方法是线程类(Thread)的静态方法,让调用线程进入睡眠状态,让出执行机会给其他线程,等到休眠时间结束后,线程进入就绪状态和其他线程一起竞争cpu的执行时间。
  • 因为sleep() 是static静态的方法,他不能改变对象的机锁,当调用sleep() 方法,线程虽然进入休眠,但是对象的锁没有被释放,其他线程依然无法访问这个对象。
public class WaitSleepDemo {public static void main(String[] args) {WaitSleepDemo ws = new WaitSleepDemo();ws.mSleep();ws.mWait();}public void mSleep() {try {System.out.println(" Sleep ----当前时间:" + System.currentTimeMillis());System.out.println(" Sleep ----当前时间:" + new Date());Thread.sleep(5 * 1000);} catch (Exception e) {System.out.println(e);}}public void mWait() {System.out.println(" Wait ---结束时间:" + System.currentTimeMillis());System.out.println(" Wait ---结束时间:" + new Date());}
}

运行结果:

 Sleep ----当前时间:1623925676174Sleep ----当前时间:Thu Jun 17 18:27:56 CST 2021Wait ---结束时间:1623925681314Wait ---结束时间:Thu Jun 17 18:28:01 CST 2021

首先线程会启动起来,然后调用ws 对象的mSleep方法,当调用sleep()方法进入了休眠状态,但是该线程并没有立刻调用mWait()方法,而是等休眠结束后,才去调用mWait()方法。从上面的运行结果可以看到5秒后wait方法才执行。所以是sleep虽然休眠了,但是仍然占用着线程。

2 wait

wait()是Object类的方法,当一个线程执行到wait方法时,它就进入到一个和该对象相关的等待池,同时释放对象的机锁,使得其他线程能够访问,可以通过notify,notifyAll方法来唤醒等待的线程。

public class WaitSleepDemo {public static void main(String[] args) {WaitSleepDemo ws = new WaitSleepDemo();new Thread(new Runnable() {@Overridepublic void run() {ws.mWait();}}).start();new Thread(new Runnable() {@Overridepublic void run() {ws.mSleep();}}).start();}public void mSleep() {synchronized (this) {try {Thread.sleep(5 * 1000);this.notifyAll();System.out.println("唤醒时间:" + new Date());} catch (Exception e) {System.out.println(e);}}}public void mWait() {synchronized (this) {try {System.out.println(" Wait ---等待时间:" + new Date());this.wait();System.out.print("继续执行等待的线程");} catch (InterruptedException e) {e.printStackTrace();}}}
}
  • 这里是先让第一个线程启动起来,然后调用mWait方法,让线程进入等待状态,并释放了ws对象的锁。
  • 这时第二个线程也启动了,来到了mSleep方法的同步代码块,因为之前的waitThread线程已经释放了ws对象的机锁,第二个线程可以拿到对象锁,所以mSleep方法是会被马上调用的。
  • 然后第二个线程线程就是进入了睡眠状态,等到5秒休眠结束后调用notifyAll()唤醒了第一个线程,然后第一个线程执行完毕。

3 区别、同

区别:

  1. 两者最主要的区别在于:sleep()方法没有释放锁,而wait()方法释放了锁。
  2. wait()通常被用于线程间的交互或者通信,sleep()通常被用于暂停执行(挂起)。
  3. sleep()是线程线程类(Thread)的方法,调用会暂停此线程指定的时间,但监控依然保持,不会释放对象锁,到时间自动恢复;wait()是Object的方法,调用会放弃对象锁,进入等待队列,待调用notify()或者notifyAll()唤醒指定的线程或者所有线程,才会进入锁池,不再次获得对象锁才会进入运行状态;或者使用wait(long timeout)超时后线程会自动苏醒。
  4. sleep()方法可以在任何地方使用;wait()方法则只能在同步方法或同步块中使用;

同:

  1. 两者都可以暂停线程的执行。
  2. sleep()方法和wait()方法被调用的时候都不会占用CPU资源
public class WaitSleepDemo {public static void main(String[] args) {// test();//test1();test2();}private static void test2() {for (int i = 0; i < 10000; i++) {System.out.print(i);WaitSleepDemo o = new WaitSleepDemo();synchronized (o){try {o.wait();} catch (InterruptedException e) {e.printStackTrace();}finally {}}}}private static void test1() {for (int i = 0; i < 10000; i++) {System.out.print(i);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}private static void test() {for (int i = 0; i < 10000; i++) {System.out.print(i);}}
}

参考:https://blog.csdn.net/laomumu1992/article/details/85269290
https://blog.csdn.net/xyh269/article/details/52613507

最新文章

  1. 让资源管理器不显示最近常用文件夹
  2. QCon北京2016启动筹备 众多热点专题诚征演讲嘉宾
  3. 几个so经常使用Function
  4. 模拟 hihoCoder 1177 顺子
  5. Alias Method解决随机类型概率问题(别名算法)
  6. leetcode76. 最小覆盖子串
  7. java web inf_Java Web中如何访问WEB-INF下的XML文件
  8. ftp linux 服务器 麒麟_阿里云ECS服务器搭建vsftpd
  9. oracle批量update 转
  10. centos 添加快捷
  11. 微信整人假红包图片_整人的微信红包玩法!微信红包图片整人!
  12. 基于GPT2实现考公申论文章生成
  13. 【解决方法】如何压缩网页字体文件
  14. Linux的vx开头的文件,微博 Qzone 微信 Linux文件及目录常用命令,进来瞅瞅
  15. GOOGLE卫星地图
  16. python爬虫小工具——下载助手
  17. 计算机英语中文谐音,翻译成中文的英文歌 英文歌用中文谐音唱
  18. pytest之Monkeypatching(猴子补丁)
  19. 防止表单在网站外部提交
  20. cisco catelyst 3560 常见问题

热门文章

  1. 有什么廉价但是技术含量很高的东西?
  2. Tor 项目弃用 obfs2,开发 obfs4
  3. 女朋友生气了怎么办?别傻傻地哄她,学会这5个技巧才是王道
  4. JavaSE基础篇 | 对象的创建和使用
  5. android:ellipsize=end 不起作用,Android应用开发Android TextView关于android:ellipsize=end的一个神奇bug解决方案...
  6. 最全最详细-线性规划(最小二乘、正交回归、梯度下降、仿真)
  7. atom ui html,几个受欢迎的Atom插件
  8. COPY failed: file not found in build context or excluded by .dockerignore
  9. 【JVM】手写Java虚拟机-02 搜索class文件
  10. 初探proto和protobuf