java中的sleep()和wait()的区别
2017-05-24 15:36
218 查看
java中的sleep()和wait()的区别
对于sleep()方法,我们首先要知道该方法是属于Thread类中的。而wait()方法,则是属于Object类中的。sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。
在调用sleep()方法的过程中,线程不会释放对象锁。
而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备
获取对象锁进入运行状态。
什么意思呢?
举个列子说明:
1 /** 2 * 3 */ 4 package com.b510.test; 5 6 /** 7 * java中的sleep()和wait()的区别 8 * @author Hongten 9 * @date 2013-12-10 10 */ 11 public class TestD { 12 13 public static void main(String[] args) { 14 new Thread(new Thread1()).start(); 15 try { 16 Thread.sleep(5000); 17 } catch (Exception e) { 18 e.printStackTrace(); 19 } 20 new Thread(new Thread2()).start(); 21 } 22 23 private static class Thread1 implements Runnable{ 24 @Override 25 public void run(){ 26 synchronized (TestD.class) { 27 System.out.println("enter thread1..."); 28 System.out.println("thread1 is waiting..."); 29 try { 30 //调用wait()方法,线程会放弃对象锁,进入等待此对象的等待锁定池 31 TestD.class.wait(); 32 } catch (Exception e) { 33 e.printStackTrace(); 34 } 35 System.out.println("thread1 is going on ...."); 36 System.out.println("thread1 is over!!!"); 37 } 38 } 39 } 40 41 private static class Thread2 implements Runnable{ 42 @Override 43 public void run(){ 44 synchronized (TestD.class) { 45 System.out.println("enter thread2...."); 46 System.out.println("thread2 is sleep...."); 47 //只有针对此对象调用notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。 48 TestD.class.notify(); 49 //================== 50 //区别 51 //如果我们把代码:TestD.class.notify();给注释掉,即TestD.class调用了wait()方法,但是没有调用notify() 52 //方法,则线程永远处于挂起状态。 53 try { 54 //sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程, 55 //但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。 56 //在调用sleep()方法的过程中,线程不会释放对象锁。 57 Thread.sleep(5000); 58 } catch (Exception e) { 59 e.printStackTrace(); 60 } 61 System.out.println("thread2 is going on...."); 62 System.out.println("thread2 is over!!!"); 63 } 64 } 65 } 66 }
运行效果:
enter thread1... thread1 is waiting... enter thread2.... thread2 is sleep.... thread2 is going on.... thread2 is over!!! thread1 is going on .... thread1 is over!!!
如果注释掉代码:
1 TestD.class.notify();
运行效果:
enter thread1... thread1 is waiting... enter thread2.... thread2 is sleep.... thread2 is going on.... thread2 is over!!!
且程序一直处于挂起状态。
标签: java, sleep, wait
好文要顶 关注我 收藏该文
Hongten
关注 - 21
粉丝 - 1670
+加关注
10
0
« 上一篇:try
{}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,还是在return之后执行?
» 下一篇:get和post方法的区别
posted @ 2013-12-10 20:52 Hongten 阅读(133266)
评论(6) 编辑 收藏
评论列表
回复引用
#1楼 2016-11-01
01:23 青青草原的羊
哈哈,谢谢楼主,豁然开朗
支持(0)反对(0)
回复引用
#2楼 2017-02-28
11:54 DesertSnow
Nice.
支持(0)反对(0)
回复引用
#3楼 2017-03-01
16:53 铭轩666
牛哥! 您的时钟很有特点! 请问怎样自己编写个放在桌面上 !!
支持(0)反对(0)
回复引用
#4楼 2017-04-05
10:04 DesertSnow
Nice Again .
支持(0)反对(0)
回复引用
#5楼 2017-04-17
16:59 GumpDai
可以说一下实战时候的场景什么时候会用到吗?意思是Thread2会影响Thread1的运行吗?
支持(0)反对(0)
回复引用
#6楼 2017-05-24
09:43 桃成蹊之
楼主第二行:sleep()是线程暂停执行指定时间而不是程序暂停执行
相关文章推荐
- java线程的sleep(),wait(),notify(),yield()方法的区别要点
- java中yield(),sleep()以及wait()的区别
- Java Sleep() 与 Wait()的机制原理与区别
- java线程 sleep()和wait()的区别
- java多线程 sleep()和wait()的区别
- java中yield(),sleep()以及wait()的区别 - -
- Java线程中sleep和wait的区别
- java多线程 sleep()和wait()的区别
- java多线程 sleep()和wait()的区别
- java线程同步原理及wait,notify的用法及与sleep的区别
- java线程的sleep(),wait(),notify(),yield()方法的区别要点
- java中yield(),sleep()以及wait()的区别
- java中yield(),sleep()以及wait()的区别
- Java Thread(线程)案例详解sleep和wait的区别
- Java中sleep和wait的区别
- java之Thread.sleep(long)与object.wait()/object.wait(long)的区别
- java sleep与wait的区别
- JAVA—sleep()和wait()的区别
- java多线程 sleep()和wait()的区别
- java多线程 sleep()和wait()的区别