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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李敬 中级黑马   /  2012-8-10 10:17  /  2245 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李敬 于 2012-8-10 10:34 编辑

在线程中经常用到
sleep(long millis)
          在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)
那如果是
Thread.sleep(0);
这代码毫无意义吗?
最好能给个具体的应用.

5 个回复

倒序浏览
public class Demo extends Thread {

       public void run() {

                for(int x=0; x<5; x++) {
                        
                   try{Thread.sleep(2000);}catch(Exception e){} /*InterruptedException线程在活动之前或活动期间处于正在等待、休眠或占用状态且该线程被中断时,抛出该异常。sleep()是 冻结一段时间,时间到了就活了
Sleep直接执行会出这个异常,对他声明或处理一下;*/
   
                                                                                                                             
                                                                  
                               System.out.println(x);

                }

        }

       public static void main(String[] args) throws Exception {

               Demo d = new Demo();

                d.start();
      
        }

}
回复 使用道具 举报
我说的是Thread.sleep(0); 那冻结0秒就继续了,那跟没有这句话有什么区别吗?
回复 使用道具 举报
李敬 发表于 2012-8-10 10:34
我说的是Thread.sleep(0); 那冻结0秒就继续了,那跟没有这句话有什么区别吗?

不好意思 解决不了
回复 使用道具 举报
本帖最后由 尤洋 于 2012-8-10 14:53 编辑

       毕老师在讲cpu工作原理时就讲到过 进程调度是抢占式的。互相抢夺的过程中   一旦一个进程在运行态时调用sleep(),进入等待态,睡眠结束以后,并不是直接回到运行态因为执行权可能已经被其他线程抢走, 因此苏醒的线程进入就绪队列,要等到其他进程放弃时间片后才能重新进入运行态
     所以sleep(0)可以看成一个运行态的进程产生一个中断由运行态直接转入就绪态。这样做是给其他就绪态进程使用时间片的机会。
回复 使用道具 举报
本帖最后由 王少岩 于 2012-8-10 15:12 编辑

由于Cpu资源是有限的,所以进程中的多个线程要抢占Cpu,这也导致进程中的多个线程交替执行。
Thread.Sleep() 本身的含义是当前线程挂起一定时间,释放执行权。
Thread.Sleep(0)其实是让当前线程挂起,使得其他线程可以和当前线程再次的抢占Cpu资源。

下图可以看做当主线程执行了一次循环时,Sleep(0)了一下,使得资源重新在两个线程中分配了一下。另一个线程抢占到资源并执行。

ww.jpg (16.98 KB, 下载次数: 74)

ww.jpg

qqq.jpg (17.11 KB, 下载次数: 72)

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