有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在Java中从构造函数调用抽象方法可以吗?

假设我有一个实现可运行接口的抽象基类

public abstract class Base implements Runnable {

  protected int param;

  public Base(final int param) {
      System.out.println("Base constructor");
      this.param = param;
      // I'm using this param here
      new Thread(this).start();
      System.out.println("Derivative thread created with param " + param);
  }

  @Override
  abstract public void run();
}

这是几个衍生类中的一个

public class Derivative extends Base {

  public Derivative(final int param) {
      super(param);
  }

  @Override
  public void run() {
      System.out.println("Derivative is running with param " + param);
  }

  public static void main(String[] args) {
      Derivative thread = new Derivative(1);
  }

}

重点是我希望我的基类做一些一般的事情,而不是每次都复制它。 实际上,它运行正常,输出总是一样的:

基本构造函数 使用参数1创建的派生线程 导数正在使用参数1运行

但在JAVA中,启动一个线程调用构造函数中的抽象方法安全吗?因为C++和C语言在大多数情况下都是不安全的,据我所知。 谢谢!


共 (1) 个答案

  1. # 1 楼答案

    this从构造函数中传递出去被称为“让this从构造函数中逃逸”,可能会导致一些特别讨厌和奇怪的错误,因为对象可能处于不一致的状态

    this被传递给另一个线程时尤其如此,如本例所示。由于JVM有权对线程中的语句进行重新排序,因此可能会出现未定义的行为/状态