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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 蒋映辉 中级黑马   /  2012-5-10 10:44  /  1693 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

一个有线程锁的函数,但是里边又要用sleep   不是就把锁给打乱了  还是整个cup都等睡眠时间过了以后才开始执行?

public synchronized  void run(){
sleep(1000);
}

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

7 个回复

倒序浏览
意思就是在cpu睡1秒钟的时候谁都全部线程都不允许执行
回复 使用道具 举报
还是锁的问题,
你要知道,一个线程拿到锁以后,没有释放锁,其他线程在哪
肯定是在等着拿到锁的线程释放锁,
拿到锁的线程sleep了,并没有释放锁,并不影响其他线程的状态

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
这个线程拿到了锁,那么它就是运行状态,其他线程就是就绪状态。他sleep了,但是锁没有释放啊,那么其他线程也没有拿到锁,只能等啊,那么就还是就绪状态啊。并不是说CPU睡着了,而是线程。
毕老师的经典例子嘛,火车里的厕所。
这人拿到锁,进去后转动锁,锁上面写上‘有人’,但是这人一转身被熏晕了,那他就SLEEP了。厕所是CPU,厕所是不会sleep的。
那么外面的人只能等着,呵呵!!外面的人就是就绪状态。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
恭喜楼上的人   跟我的想法一样  但是经过测试 这个想法是错误的。
  1.   class T2 extends Thread{
  2.           public synchronized  void run(){
  3.                   System.out.println("1");
  4.                         try {
  5.                                 sleep(5000);
  6.                         } catch (InterruptedException e) {
  7.                                 // TODO Auto-generated catch block
  8.                                 e.printStackTrace();
  9.                         }
  10.                         System.out.println("1");
  11.                 }
  12.   }
  13.   
  14.   class T3 extends Thread{
  15.           public synchronized  void run(){
  16.                   System.out.println("9");
  17.                         try {
  18.                                 sleep(5000);
  19.                         } catch (InterruptedException e) {
  20.                                 // TODO Auto-generated catch block
  21.                                 e.printStackTrace();
  22.                         }
  23.                         System.out.println("8");
  24.                 }
  25.   }


  26. public class T1   {
  27.         public static void main(String[] args) {
  28.                 T2 t=new T2();
  29.                 t.start();
  30.                 T3 t3=new T3();
  31.                 t3.start();
  32.                
  33.        

  34.         }

  35. }
复制代码
上面代码的输出结果是 1,9 然后过一会才输入2 8也就是说  该上厕所的还是上了
回复 使用道具 举报
当程序执行到sleep(1000)时候,其所在的线程会休眠一秒钟。
回复 使用道具 举报
有些问题不要过多纠结,想我那样理解就ok了。
当程序执行到sleep(1000)时候,其所在的线程会休眠一秒钟,其任务也暂停一秒。
回复 使用道具 举报
黄坚声 发表于 2012-5-10 16:24
有些问题不要过多纠结,想我那样理解就ok了。
当程序执行到sleep(1000)时候,其所在的线程会休眠一秒钟,其 ...

呵呵  我就是这样理解导致写代码的时候出错了啊   你会遇到这样情况的 到时候你就懂了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马