A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 榨菜 高级黑马   /  2014-3-12 20:38  /  1517 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

这三个方法有什么调用后线程处于的状态不同之处?
sleep() wait()
yield()  




4 个回复

正序浏览
1.sleep()使线程休眠一段时间,一段时间结束后,线程进入可执行状态,但并不是立即执行,只是在被排程器调用的时候才执行。在休眠期间,并不释放所持有的“锁”;
2.wait()使线程休眠一段时间,若设置参数,时间到时,线程就自动进入可执行状态。若没有,则需要notify()方法去调用。注意:wait()方法和notify()方法都时针对this对象的,调用wait()方法后,会释放加在对象上的“锁”。
3.yield()使线程放弃执行的权利,进入可执行状态,也就意味着线程在yield()方法后,有可能又执行。使用yield()方法,线程并不释放自己锁持有的“锁”。

评分

参与人数 1黑马币 +6 收起 理由
榨菜 + 6 很给力!

查看全部评分

回复 使用道具 举报
  sleep方法       
  可以调用Thread的静态方法  :
  public static void sleep (long millis)throws IntreeuptedException
  使得当前线程休眠暂停millis毫秒
  由于是静态方法,sleep可以由类名直接调用:Thread.sleep(...)
  Sleep时别的线程不可以访问锁定对象

      Wait
      Wait时别的线程可以访问锁定对象,调用wait方法时候必须锁定该对象
 
  yeld方法
  让出cpu给其他线程执行的机会

评分

参与人数 1黑马币 +3 收起 理由
榨菜 + 3 赞一个!

查看全部评分

回复 使用道具 举报

回复 使用道具 举报
1、sleep()
        使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁。也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据。注意该方法要捕捉异常。
        例如有两个线程同时执行(没有synchronized)一个线程优先级为MAX_PRIORITY,另一个为MIN_PRIORITY,如果没有Sleep()方法,只有高优先级的线程执行完毕后,低优先级的线程才能够执行;但是高优先级的线程sleep(500)后,低优先级就有机会执行了。
        总之,sleep()可以使低优先级的线程得到执行的机会,当然也可以让同优先级、高优先级的线程有执行的机会。

2、join()
        join()方法使调用该方法的线程在此之前执行完毕,也就是等待该方法的线程执行完毕后再往下继续执行。注意该方法也需要捕捉异常。

3、yield()
        该方法与sleep()类似,只是不能由用户指定暂停多长时间,并且yield()方法只能让同优先级的线程有执行的机会。

评分

参与人数 1黑马币 +6 收起 理由
榨菜 + 6 很给力!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马