实例化新线程的方式是否会产生影响?

时间:2016-11-18 09:40:57

标签: java instantiation java-threads

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

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

并且像这样:

new SomeThread().start();

类SomeThread 中的构造函数是否仍会被实例化?

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

注意:类 SomeThread 扩展了Thread

4 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:3)

  

或者它实际上是否第二次跳过实例化构造函数......?

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

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

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

...直接进入run()方法?

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

答案 2 :(得分:2)

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

答案 3 :(得分:2)

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

您可以通过让构造函数产生一些副作用(例如打印到std out)(例如下面打印两次)来轻松测试它。

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();
        }
    }
}

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