我们可以在构造函数上使用wait()方法吗?Java的

FIL*_*IaS 2 java concurrency constructor wait

我们可以在构造函数上使用wait()方法吗?我有一个构造函数方法,其中我调用一些其他初始化方法和gui方法之后.但它接缝是它在第一种方法之前加载gui.因此它会给尚未初始化的对象带来错误.我尝试在gui的调用之前使用wait()但是有一个IllegalMonitorStateException错误,因为它不在同步块中.

试着这样做:

dice = new Dice();
this.generateBoard();
this.generateCells();

this.wait(200,100);   //otherwise??
//GUI
board = new GUI(this);
Run Code Online (Sandbox Code Playgroud)

Pét*_*rök 6

如你所说,你应该wait()在一个synchronized街区内打电话.并且默认情况下同步意味着您可以锁定this,从而实际上在完全构造之前发布对象 - 这是一个非常糟糕的主意.

但是 - 正如@Jon指出的那样 - 即使你明确地锁定了一个不同的对象this,你仍然需要this过早地发布到另一个线程以便wait()有意义(否则谁可以notify()呢?).所以这个计划闻起来.

更好的选择是使用静态工厂方法完全构造对象,然后安全地发布它:

class MyClass {
  private MyClass() {
    ...
  }
  public static MyClass createAndPublish() {
    MyClass theInstance = new MyClass();
    // here you can already synchronize on theInstance, call wait() etc.
    return theInstance;
  }
}
Run Code Online (Sandbox Code Playgroud)

请注意,声明构造函数private以确保创建新实例的唯一方法是通过createAndPublish():

MyClass newInstance = MyClass.createAndPublish();
Run Code Online (Sandbox Code Playgroud)