代码如下:public class MachineThree extends Thread
{
private int i = 0;
private static int count = 0;
public void start()
{
super.start();   
System.out.println(currentThread().getName()+":第"+(++count)+"个Machine线程启动");
}
public void run()
{
for(i=0;i<50;i++)
{
System.out.println(currentThread().getName()+":"+i);

}
}
public static void main(String[] args)
{
MachineThree machine1 = new MachineThree();
MachineThree machine2 = new MachineThree();
machine1.start();   
machine2.start();
}
}运行的结果为:
main:第1个Machine线程启动
main:第2个Machine线程启动
Thread-0:0
Thread-0:1
Thread-0:2
Thread-0:3
Thread-0:4
Thread-0:5
Thread-0:6
Thread-0:7
Thread-1:0
Thread-1:1请教一个问题:
super.start();这一句是写在前面的,那么应该先执行这句话啊!那么应该先输出:
Thread-0:0
Thread-0:1
这样的内容,但是我试了很多次,每次都是先输出:
main:第1个Machine线程启动
main:第2个Machine线程启动
请问这是怎么回事啊?谢谢大家!
   

解决方案 »

  1.   

    super.start();调用的是Thread类的run()方法,那么它应该是调用Thread类的run()方法啊?但是它这里怎么调用了MachineThree类的run()方法啊?谢谢?
      

  2.   

    start只是使其可以被调度,run()是调度时执行的,
    这儿有个线程状态图,参考一下吧.
    http://www.blogjava.net/vincent/archive/2009/07/24/288104.html
      

  3.   

    Thread 的run 是空的,似乎没任何操作
      

  4.   

    楼主请仔细测试,很明显,会发生先输出
    Thread-0:0 
    Thread-0:1 
    再输出:main:第1个Machine线程启动 
    的情况
      

  5.   

    其实执行顺序是不定的,但是你的代码是先启动线程1后启动线程2,在操作系统级别1被调度的顺序应该在2前面,至于它是先执行线程1的run还是先打印“第"+(++count)+"个Machine线程启动”,这个也是没有顺序可言的
      

  6.   

    线程启动的时机不是没有间隙的,也就是两个相继启动的线程之间先执行的顺序是不确定的至于super.start,启动一个线程本来就是调用Thread类的start方法,覆盖了之后就需要显示调用父类的被覆盖方法了
      

  7.   


    E:\java>javac MachineThree.javaE:\java>java MachineThree
    main:第1个Machine线程启动
    Thread-0:0
    main:第2个Machine线程启动
    Thread-1:0
    Thread-1:1
    Thread-0:1
    Thread-1:2
    Thread-1:3
    Thread-1:4
    Thread-1:5
    Thread-1:6
    Thread-1:7
    Thread-1:8
    Thread-0:2
    Thread-1:9
    Thread-0:3
    Thread-1:10
    Thread-0:4
    Thread-1:11
    Thread-1:12
    Thread-1:13
    Thread-0:5
    Thread-1:14
    Thread-0:6
    Thread-1:15
    Thread-0:7
    Thread-1:16
    Thread-0:8
    Thread-1:17
    Thread-0:9
    Thread-0:10
    Thread-0:11
    Thread-0:12
    Thread-0:13
    Thread-0:14
    Thread-0:15
    Thread-0:16
    Thread-0:17
    Thread-0:18
    Thread-0:19
    Thread-0:20
    Thread-0:21
    Thread-0:22
    Thread-0:23
    Thread-0:24
    Thread-0:25
    Thread-0:26
    Thread-0:27
    Thread-0:28
    Thread-0:29
    Thread-0:30
    Thread-0:31
    Thread-0:32
    Thread-0:33
    Thread-0:34
    Thread-0:35
    Thread-0:36
    Thread-0:37
    Thread-0:38
    Thread-0:39
    Thread-0:40
    Thread-0:41
    Thread-0:42
    Thread-0:43
    Thread-0:44
    Thread-0:45
    Thread-0:46
    Thread-0:47
    Thread-0:48
    Thread-0:49
    Thread-1:18
    Thread-1:19
    Thread-1:20
    Thread-1:21
    Thread-1:22
    Thread-1:23
    Thread-1:24
    Thread-1:25
    Thread-1:26
    Thread-1:27
    Thread-1:28
    Thread-1:29
    Thread-1:30
    Thread-1:31
    Thread-1:32
    Thread-1:33
    Thread-1:34
    Thread-1:35
    Thread-1:36
    Thread-1:37
    Thread-1:38
    Thread-1:39
    Thread-1:40
    Thread-1:41
    Thread-1:42
    Thread-1:43
    Thread-1:44
    Thread-1:45
    Thread-1:46
    Thread-1:47
    Thread-1:48
    Thread-1:49我的机器的运行结果是这样的,可见线程的运作跟在不同的机器表现出来的结果也是不同的。
    start()方法调用后,告诉系统可以启动run()方法,然后返回start方法继续执行,这样run与start就可能并行进行。
      

  8.   

    我狂晕
    System.out.println(currentThread().getName()+":第"+(++count)+"个Machine线程启动");
    你写的这句,这样问你.如果machine2先运行,这里输出什么,提示一下,这时候count是第一次访问
    所以说:无论谁先运行,肯定先输出第1个Machine线程启动
      

  9.   

    //每一个线程的起动就相当于开了一条路。你没有停止他会一止执行下去。
    public class MachineThree extends Thread
    {
        private int i = 0;
        private static int count = 0;
        public void start()
        {
            super.start();   //又一条路开始。但是他不会终止上两条路的执行。
            System.out.println(currentThread().getName()+":第"+(++count)+"个Machine线程启动");
        }
        public void run()
        {
            for(i=0;i<50;i++)
            {
                System.out.println(currentThread().getName()+":"+i);
                
            }
        }
        public static void main(String[] args)
        {
            MachineThree machine1 = new MachineThree();
            MachineThree machine2 = new MachineThree();
            machine1.start();   //第一条路开启。
            machine2.start();   //第二条路开启。
        }
    }
      

  10.   

    线程的状态分为:
    创建
    运行
    阻塞
    就绪
    start()方法只是开启一个线程,即在就绪状态。并未运行。
    至于何时运行,这是未知的,需要CPU来调度。
    你多运行几次结果就不一样了。
    我运行了几次其中有这样的结果:
    Thread-0:0
    Thread-0:1
    main:第1个Machine线程启动
    Thread-0:2
    Thread-0:3
    ...
    ...