黑马程序员技术交流社区

标题: 多线程中sleep的问题 [打印本页]

作者: 李贺晓    时间: 2012-11-15 09:20
标题: 多线程中sleep的问题
class FirstThread extends Thread
{
private int i;
public void run()//重写run方法
{
  for(int i=0;i<20;i++)
  {
   //当线程类继承Thread时,可以直接调用getName()方法来获取当前线程的名称
   //如果想获取当前线程的名称,用this即可
   System.out.println(Thread.currentThread().getName()+"......."+i);
  }
}
public static void main(String[] args)
{
  for(int i=0;i<20;i++)
  {
   //调用Thread的currentThread()方法获取当前线程
   System.out.println(Thread.currentThread().getName()+".."+i);
   if(i==10)
   {
    try
    {
     Thread.sleep(100);
    }
    catch (Exception e)
    {
    }
   
    //创建并启动第一条线程
    new FirstThread().start();
    //创建并启动第二条线程
    new FirstThread().start();
   }
  }
}
}
在程序中我当i等于10的时候,让主程序睡眠100毫秒,这样运行出来的程序不是应该每次都是当i等于10后,就开始运行其他两个线程,但是我运行后,感觉这里的sleep都没有起作用啊,有时候还是i等于10以后的数值,才开始运行其他的两个线程
作者: 会飞的鱼    时间: 2012-11-15 09:35
线程sleep之后,它放弃了cpu的使用权,跟wait不同的是,时间一过,他就会自动醒过来,无须别人notity唤醒。

但是sleep之后,并不是你指定的时间一过,cpu就会执行你这个线程,因为还有别的线程在抢占cpu资源。

等到cpu执行你的时候,可能已经过了10了。这就是为什么你说的sleep时间过来,还没有立即执行的原因。

而sleep跟wait的唯一区别就是wait甚至是永久的sleep,如果没有别人把它给唤醒。醒了之后,都是进入了线程池去抢占cpu资源去了。
作者: 陈军    时间: 2012-11-15 09:51
100毫秒太小了。  你可以设置大点比如几秒。。来试下
作者: 李贺晓    时间: 2012-11-15 09:56
阳永衡 发表于 2012-11-15 09:35
线程sleep之后,它放弃了cpu的使用权,跟wait不同的是,时间一过,他就会自动醒过来,无须别人notity唤醒。 ...

这个slepp是让主线程睡眠100毫秒,当主线程睡眠时,这个是子线程不是应该获得cpu来执行,就是说主线程的i等于10时,这个时候应该释放cpu,子线程获得执行权了,应该是主线程的i等于10后,应该是执行Thread-0或Thread-1,但是我运行后,好多次还是执行的main主线程,并没有执行子线程
你理解错误了,我的意思并不是说mian主线程获得不到cpu了,。。。
作者: 会飞的鱼    时间: 2012-11-15 10:32
李贺晓 发表于 2012-11-15 09:56
这个slepp是让主线程睡眠100毫秒,当主线程睡眠时,这个是子线程不是应该获得cpu来执行,就是说主线程的i ...

其实并不是只有子线程在跟main线程抢资源,就算你main线程不sleep,也有别的应用程序的线程在跟这个main线程在抢cpu资源,当main执行一段时间后,别被的应用程序的线程给抢去了,这样是不是就算你的main线程不sleep,你的子线程Thread-0,Thread-1还是等了一会才执行的???




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2