1

我正在研究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&3。

请解释。

4

5 回答 5

4

每次您创建一个Bunnies扩展的Thread时,您也会创建一个Thread因此数字中的空白。

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

但是请注意,您不应依赖线程编号,因为javadoc不保证编号是连续的。

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

public static void main(String[] args) {
    Bunnies b = new Bunnies();
    Thread t = new Thread(b);
    Bunnies b1 = new Bunnies();
    Thread t1 = new Thread(b1);
    System.out.println(b.getName()); //Thread-0
    System.out.println(t.getName()); //Thread-1
    System.out.println(b1.getName()); //Thread-2
    System.out.println(t1.getName()); //Thread-3
}
于 2012-12-17T11:44:10.810 回答
1

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

在抽象视图上至少有 5 个线程maintt1。(和两个匿名线程)

class Bunnies extends Thread

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

由于main不执行run方法和匿名线程不启动,即start()不调用。只有tandt1将执行run方法,因此您只会得到两个线程名称。

命名顺序如下:

在此处输入图像描述

于 2012-12-17T11:42:21.990 回答
0

在您的代码中,Bunnies 是一个线程(和一个 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() + "  ");
        }
    }
}
于 2012-12-17T12:45:45.677 回答
0

如果您没有明确指定线程名称,则由运行时环境生成。

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

正如@assylias 正确认识到的那样,Thread-2已经在使用的原因是它Bunnies本身就是一个线程,因此在创建线程时t,不仅已经创建了一个,而且已经创建了两个线程,运行时为其创建了唯一的名称。

于 2012-12-17T11:44:27.263 回答
0

好吧,你有两个Bunnies线程。如何命名它们取决于运行时。在您的情况下,它选择调用它们Thread-1并且Thread-3. 据推测,发生这种情况是因为您子类化Thread而不是Runnable. 结果,您最终得到了四个线程对象,其中只有两个作为单独的线程运行。

如果您希望它们被称为其他名称,则可以使用该Thread.setName()方法。

于 2012-12-17T11:43:14.877 回答