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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李贺晓 中级黑马   /  2012-11-15 09:20  /  2119 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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以后的数值,才开始运行其他的两个线程

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
线程sleep之后,它放弃了cpu的使用权,跟wait不同的是,时间一过,他就会自动醒过来,无须别人notity唤醒。

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

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

而sleep跟wait的唯一区别就是wait甚至是永久的sleep,如果没有别人把它给唤醒。醒了之后,都是进入了线程池去抢占cpu资源去了。

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
100毫秒太小了。  你可以设置大点比如几秒。。来试下
回复 使用道具 举报
阳永衡 发表于 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 09:56
这个slepp是让主线程睡眠100毫秒,当主线程睡眠时,这个是子线程不是应该获得cpu来执行,就是说主线程的i ...

其实并不是只有子线程在跟main线程抢资源,就算你main线程不sleep,也有别的应用程序的线程在跟这个main线程在抢cpu资源,当main执行一段时间后,别被的应用程序的线程给抢去了,这样是不是就算你的main线程不sleep,你的子线程Thread-0,Thread-1还是等了一会才执行的???
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马