实例化新线程的方式是否有所不同?

Does the way of instantiating a new Thread make a difference?

像这样实例化 Thread 之间有什么区别(如果有的话)

SomeThread t = new SomeThread();
t.start();

像这样:

new SomeThread().start();

classSomeThread中的constructor还会被实例化吗?

或者它实际上跳过了第二次实例化构造函数并直接进入 运行()- 方法?

注:class SomeThread extends Thread

new 关键字用于创建对象,您仍在调用构造函数,正如您在 SomeThread() 的调用中看到的那样。以上两个代码示例是等价的。

除了第一种情况保留对变量的引用外,没有区别。创建实例时构造函数始终运行。

两种方法都调用构造函数并实例化对象。区别只是在第二种情况下您跳过了实例化对象的变量赋值。

您可以轻松地自行测试,方法是让构造函数产生一些副作用,例如打印到标准输出(例如,下面打印两次调用)。

package com.example;


public final class ThreadTest {

    public static void main(String[] args) {
        SomeThread thread1 = new SomeThread();
        thread1.run();

        new SomeThread().run();
    }


    public static final class SomeThread extends Thread{


        public SomeThread() {
            System.out.println("called");
        }


        @Override
        public void run() {
            // TODO Auto-generated method stub
            super.run();
        }
    }
}

当您不在代码中使用变量时,这两种方法之间没有真正的区别。

Or does it actually skip instantiating the constructor the second time...?

两种情况下都会调用构造函数并初始化实例。不同之处在于无法重用第二个示例中创建的实例。

为了使它们等效,您需要将该实例保存到一个变量中:

SomeThread t;
(t = new SomeThread()).start();

... and go straight for the run() method?

run 方法是实例方法,因此要调用它,您必须在已定义的对象上调用此方法。