Java 如果我给一个线程命名,但显式调用run(),会怎么样?

Java 如果我给一个线程命名,但显式调用run(),会怎么样?,java,multithreading,Java,Multithreading,我知道,当我们显式调用run()时,不会启动新线程,而run()中编写的代码会在主线程上执行。但是,如果我给一个线程命名,然后像代码中所示显式地调用run(),会怎么样 public class ThreadImpl1 extends Thread{ ThreadImpl1(String name){ super(name); //start(); } public void run() { for(int i=0;i&l

我知道,当我们显式调用
run()
时,不会启动新线程,而
run()
中编写的代码会在主线程上执行。但是,如果我给一个线程命名,然后像代码中所示显式地调用
run()
,会怎么样

public class ThreadImpl1 extends Thread{

    ThreadImpl1(String name){
        super(name);
        //start();
    }

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

   public static void main(String...s) {
      ThreadImpl1 t1=new ThreadImpl1("thread1");
      t1.run();
      for(int i=0;i<5;i++)
           System.out.println(Thread.currentThread().getName());
   }
}
为什么输出显示其名称,即thread1?我还没有启动线程,所以它应该一直打印“main”您不启动线程,只需像常规方法一样调用类
ThreadImpl1
run()
方法

就像您调用
toString()
。。。在类上

调用
t1.run()时
您不启动线程,只需像常规方法一样调用类
ThreadImpl1
run()
方法


就像您调用
toString()
。。。在类上,这是因为您正在run()方法中调用getName()。这将返回您设置的字段“name”的值


您应该调用Thread.currentThread().getName()。

这是因为您正在run()方法中调用getName()。这将返回您设置的字段“name”的值


您应该调用Thread.currentThread().getName()。

运行方法将与普通方法一样在当前线程中执行。不会创建新线程。然后,尝试它以获得明确的答案:)

运行
方法将像普通方法一样在当前线程中执行。不会创建新线程。然后,试着得到明确的答案:)

它为什么要输出main?您为
Thread
对象指定了thread1的名称。我在输出中预期main 10次,因为在调用t1.run()时没有创建新线程,但我忘记了run()中对getname()的调用已隐式转换为t1.getname(),其中t1是ThreadImpl1类的对象。这就是我无法理解的。为什么它要输出main?您为
Thread
对象指定了thread1的名称。我在输出中预期main 10次,因为在调用t1.run()时没有创建新线程,但我忘记了run()中对getname()的调用已隐式转换为t1.getname(),其中t1是ThreadImpl1类的对象。这是我无法理解的。是的,当我在run()中使用Thread.currentThread().getName()而不是getName()时,我在输出中始终得到“main”。非常感谢。现在我得到了我所缺少的东西。是的,当我在run()中使用Thread.currentThread().getName()而不是getName()时,我总是在输出中得到“main”。非常感谢。现在我得到了我错过的东西。
thread1
thread1
thread1
thread1
thread1
main
main
main
main
main