不懂线程o / p

时间:2012-12-17 11:37:59

标签: java multithreading

我在做scjp学习, 我的问题如下:

public class Bunnies extends Thread{


    public static void main(String[] args) {
        Thread t = new Thread(new Bunnies());
        Thread t1 = new Thread(new Bunnies());
        t.start();
        t1.start();

    }
    public  void run()
    {
        for(int i=0; i<3; i++)
        {
            System.out.println(Thread.currentThread().getName()+"  ");
        }
    }

}

当我跑到上面的程序时,我得到如下的o / p:

Thread-1  
Thread-1  
Thread-1  
Thread-3  
Thread-3  
Thread-3  

这里我不明白为什么Thread-2没有在这里显示,只有Thread 1&amp; 3。

请解释。

5 个答案:

答案 0 :(得分:4)

每次创建扩展Bunnies的{​​{1}}时,您还会创建Thread因此数字中的差距。

你的第一次跑步:ThreadThread t = new Thread(new Bunnies());new Bunnies()Thread-0t 然后你运行Thread-1Thread t1 = new Thread(new Bunnies());new Bunnies()Thread-2t1

但请注意,您不应该依赖于线程编号,因为the javadoc并不能保证这些数字是连续的。

您可以使用以下代码进行验证:

Thread-3

答案 1 :(得分:1)

  

这里我不明白为什么Thread-2没有在这里显示;只有主题1和3。

在抽象视图中,至少有5个主题:maintt1。 (和两个匿名线程)

class Bunnies extends Thread

因此,当您创建类Bunnies的对象时,会创建一个线程并且JVM会为其指定一个名称。

由于main未执行run方法且未启动匿名线程,因此未调用start()。只有tt1会执行run方法,因此您只获得两个线程名称。

命名顺序如下:

enter image description here

答案 2 :(得分:0)

好吧,你有两个Bunnies个主题。它取决于运行时如何选择命名它们。在您的情况下,它会选择将其称为Thread-1Thread-3。据推测,这是因为您继承了Thread而不是Runnable。因此,您最终会得到四个线程对象,其中只有两个作为单独的线程运行。

如果您希望将它们调用为其他内容,则可以使用Thread.setName()方法。

答案 3 :(得分:0)

如果未明确指定线程名称,则由Runtime环境生成一个。

生成这些线程名称取决于运行时。可能名称“Thread-2”已经在使用,例如对于某些后台线程,所以下一个可用的线程将是“Thread-3”。

正确识别@assylias后,Thread-2已被使用的原因是Bunnies本身就是一个线程,因此在创建线程t时,不仅只有一个而是两个线程已经创建了运行时为其创建唯一名称。

答案 4 :(得分:0)

在你的代码中,Bunnies是一个Thread(和一个Runnable),但你使用它,因为它只是一个Runnable,实际上你应该这样做:

public class Bunnies extends Thread {

    public static void main(String[] args) {
        Thread t = new Bunnies();
        Thread t1 = new Bunnies();
        t.start();
        t1.start();

    }

    public void run() {
        for (int i = 0; i < 3; i++) {
            System.out.println(Thread.currentThread().getName() + "  ");
        }
    }
}

或者像这样:

public class Bunnies implements Runnable{

    public static void main(String[] args) {
        Thread t = new Thread(new Bunnies());
        Thread t1 = new Thread(new Bunnies());
        t.start();
        t1.start();

    }

    public void run() {
        for (int i = 0; i < 3; i++) {
            System.out.println(Thread.currentThread().getName() + "  ");
        }
    }
}