我在做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。
请解释。
答案 0 :(得分:4)
每次创建扩展Bunnies
的{{1}}时,您还会创建Thread
因此数字中的差距。
你的第一次跑步:Thread
。 Thread t = new Thread(new Bunnies());
为new Bunnies()
,Thread-0
为t
然后你运行Thread-1
。 Thread t1 = new Thread(new Bunnies());
为new Bunnies()
,Thread-2
为t1
。
但请注意,您不应该依赖于线程编号,因为the javadoc并不能保证这些数字是连续的。
您可以使用以下代码进行验证:
Thread-3
答案 1 :(得分:1)
这里我不明白为什么Thread-2没有在这里显示;只有主题1和3。
在抽象视图中,至少有5个主题:main
,t
和t1
。 (和两个匿名线程)
class Bunnies extends Thread
因此,当您创建类Bunnies
的对象时,会创建一个线程并且JVM会为其指定一个名称。
由于main
未执行run
方法且未启动匿名线程,因此未调用start()
。只有t
和t1
会执行run
方法,因此您只获得两个线程名称。
命名顺序如下:
答案 2 :(得分:0)
好吧,你有两个Bunnies
个主题。它取决于运行时如何选择命名它们。在您的情况下,它会选择将其称为Thread-1
和Thread-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() + " ");
}
}
}