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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

class Demoextends extends Thread
{
        private int x=10;
        public void run()
        {
                while(x>0)
                {
                        System.out.println(Thread.currentThread().getName()+" extends:"+x--);
                }
        }

}

class demo
{
        public static void main(String[] argv)
        {
                Demoextends d1 = new Demoextends();
                Demoextends d2 = new Demoextends();
                d1.start();
                d2.start();
                d1.run();
                d2.run();
        }
}


---------- java ----------
main extends:10
main extends:8
main extends:7
main extends:6
main extends:5
main extends:4
main extends:3
main extends:2
main extends:1
main extends:9
main extends:8
main extends:7
main extends:6
main extends:5
main extends:4
main extends:3
main extends:2
main extends:1
Thread-0 extends:9
Thread-1 extends:10

输出完成 (耗时 0 秒) - 正常终止

为什么输出的是这个 我明明创建了两个线程 求解

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

7 个回复

倒序浏览
这是你直接调用了run方法的缘故main线程优先执行了d1对象里的run方法把变量减到了1
回复 使用道具 举报
本帖最后由 王亚男 于 2012-3-15 20:51 编辑

没什么不对啊。
你创建了两个线程不假,但是还有默认的主线程。
当主线程执行到
Demoextends d1 = new Demoextends();
Demoextends d2 = new Demoextends();
创建了两个线程,然后执行
d1.start();
d2.start();
到这里时,俩线程都有了执行资格,但执行权还在主线程手里。然后主线程又继续执行到了
d1.run();
d2.run();
你这样执行run是不具备线程特性的,run这时只算是Demoextends类的一个普通的方法,只有调用start()方法才有线程特性。
这时run()执行的是里面的内容,由于主线程也是线程,所以你调用Thread.currentThread().getName打印出的是主线程的名字 ,还有x的值。也就是这块儿:
main extends:10
main extends:8
main extends:7
main extends:6
main extends:5
main extends:4
main extends:3
main extends:2
main extends:1
main extends:9
main extends:8
main extends:7
main extends:6
main extends:5
main extends:4
main extends:3
main extends:2
main extends:1
你建立了两个对象d1和d2,每个对象里都有一个10,所以减完就结束了。在执行期时,d1和d2线程也会抢夺CPU执行权,每次打印出的结果是不一样的。

所以你想看线程之间争夺CPU执行权的话,你把d1.run()和d2.run()注释掉就可以了。

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
       d1.run();
                d2.run();
线程速度执行被后面这2个顺序执行的主线程覆盖了 二他们就只分别执行了1次
回复 使用道具 举报
另外,你利用的是继承方式,而不是实现方式。只有接口才有实现。
所以你要用实现方式创建线程的话,要 implements Runnable
回复 使用道具 举报
刚刚试了下 确实是的 两个注释掉就好了
回复 使用道具 举报
李创 中级黑马 2012-3-15 20:55:37
7#
谢谢啊{:soso_e100:}
回复 使用道具 举报
加上主函数实际上有3个线程。因为cpu同一时间内只能执行一个程序的一个线程,当d1,d2线程开启时要先去抢cpu执行权,
此时执行权还在主函数那里所以主函数继续执行;主函数也是一个独立的线程,他和d1,d2同时运行着。
下面代码可以可以打印当前线程里的对象对应的哈希值,你运行自己在琢磨下
  1. class Demoextends extends Thread
  2. {
  3.         private int x=10;
  4.         public void run()
  5.         {
  6.                 while(x>0)
  7.                 {
  8.                         System.out.println(Thread.currentThread().getName()+".."+this.hashCode()+" extends:"+x--);
  9.                 }
  10.         }

  11. }

  12. class demo
  13. {
  14.         public static void main(String[] argv)
  15.         {
  16.                 Demoextends d1 = new Demoextends();
  17.                 Demoextends d2 = new Demoextends();
  18.                 d1.start();
  19.                 d2.start();
  20.                 d1.run();
  21.                 d2.run();
  22.         }
  23. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马