java中的sleep()和wait()的区别_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > java中的sleep()和wait()的区别

java中的sleep()和wait()的区别

 2013/12/11 16:09:10  漫薛缝  程序员俱乐部  我要评论(0)
  • 摘要:对于sleep()方法,我们首先要知道该方法是属于Thread类中的。而wait()方法,则是属于Object类中的。sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。在调用sleep()方法的过程中,线程不会释放对象锁。而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。什么意思呢
  • 标签:区别 Java
  对于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培训专注软件开发培训,提升学员就业能力,重点提升实践动手能力。疯狂软件开设了java课程,ios课程,android课程,为你提供一个学习java技能的好机会,疯狂软件特大优惠活动,加疯狂软件微信号(疯狂软件),抢优惠,优惠100元+赠送iOS教材一本 详情请看疯狂java培训官网。IT从业着仍是社会所需要的高端人才,广州疯狂软件之力于培养企业所需要的中高端IT人才,让你成为备受企业青睐的人才。
  疯狂Java培训专注软件开发培训,提升学员就业能力,重点提升实践动手能力。技术知识沉淀深厚的老师,让你感受Java的魅力,激发你对于编程的热爱,让你在半年的时间内掌握8-10万的代码量,掌握Java核心技术,成为真正的技术高手;通过大量全真企业项目疯狂训练,迅速积累项目经验。让你成为技能型的现代化高端人才,迅速获得高薪就业!时间不等人,赶紧联系我们吧!疯狂java培训中心地址:广州天河区车陂沣宏大厦3楼。
发表评论
用户名: 匿名