sleep()和wait()
2024-05-16 10:10:51
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 区别、同
区别:
- 两者最主要的区别在于:sleep()方法没有释放锁,而wait()方法释放了锁。
- wait()通常被用于线程间的交互或者通信,sleep()通常被用于暂停执行(挂起)。
- sleep()是线程线程类(Thread)的方法,调用会暂停此线程指定的时间,但监控依然保持,不会释放对象锁,到时间自动恢复;wait()是Object的方法,调用会放弃对象锁,进入等待队列,待调用notify()或者notifyAll()唤醒指定的线程或者所有线程,才会进入锁池,不再次获得对象锁才会进入运行状态;或者使用wait(long timeout)超时后线程会自动苏醒。
- sleep()方法可以在任何地方使用;wait()方法则只能在同步方法或同步块中使用;
同:
- 两者都可以暂停线程的执行。
- 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
最新文章
- 让资源管理器不显示最近常用文件夹
- QCon北京2016启动筹备 众多热点专题诚征演讲嘉宾
- 几个so经常使用Function
- 模拟 hihoCoder 1177 顺子
- Alias Method解决随机类型概率问题(别名算法)
- leetcode76. 最小覆盖子串
- java web inf_Java Web中如何访问WEB-INF下的XML文件
- ftp linux 服务器 麒麟_阿里云ECS服务器搭建vsftpd
- oracle批量update 转
- centos 添加快捷
- 微信整人假红包图片_整人的微信红包玩法!微信红包图片整人!
- 基于GPT2实现考公申论文章生成
- 【解决方法】如何压缩网页字体文件
- Linux的vx开头的文件,微博 Qzone 微信 Linux文件及目录常用命令,进来瞅瞅
- GOOGLE卫星地图
- python爬虫小工具——下载助手
- 计算机英语中文谐音,翻译成中文的英文歌 英文歌用中文谐音唱
- pytest之Monkeypatching(猴子补丁)
- 防止表单在网站外部提交
- cisco catelyst 3560 常见问题
热门文章
- 有什么廉价但是技术含量很高的东西?
- Tor 项目弃用 obfs2,开发 obfs4
- 女朋友生气了怎么办?别傻傻地哄她,学会这5个技巧才是王道
- JavaSE基础篇 | 对象的创建和使用
- android:ellipsize=end 不起作用,Android应用开发Android TextView关于android:ellipsize=end的一个神奇bug解决方案...
- 最全最详细-线性规划(最小二乘、正交回归、梯度下降、仿真)
- atom ui html,几个受欢迎的Atom插件
- COPY failed: file not found in build context or excluded by .dockerignore
- 【JVM】手写Java虚拟机-02 搜索class文件
- 初探proto和protobuf