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

我们可以在构造函数上使用wait()方法吗?JAVA,java,concurrency,constructor,wait,Java,Concurrency,Constructor,Wait,我们可以在构造函数上使用wait()方法吗? 我有一个构造函数方法,在这个方法中,我调用了一些其他的初始化方法和gui的方法。但它必须在第一个方法之前加载gui。因此,它会给尚未初始化的对象带来错误。我试图在gui调用之前使用wait(),但出现了一个非法MonitorStateException错误,因为它不在同步块中 试图做那样的事: dice = new Dice(); this.generateBoard(); this.generateCells(); this.wait(200,1

我们可以在构造函数上使用wait()方法吗? 我有一个构造函数方法,在这个方法中,我调用了一些其他的初始化方法和gui的方法。但它必须在第一个方法之前加载gui。因此,它会给尚未初始化的对象带来错误。我试图在gui调用之前使用wait(),但出现了一个非法MonitorStateException错误,因为它不在同步块中

试图做那样的事:

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

this.wait(200,100);   //otherwise??
//GUI
board = new GUI(this);
嗯,您可以在构造函数中使用
wait
——您只需在构造函数中的“this”上同步即可:

// I'm not actually recommending this...
synchronized (this) {
    this.wait(...);
}
但是,不清楚
会通知
引用什么,除非您在构造函数中将“this”泄漏到另一个线程中使用它的东西


老实说,现在还不清楚这是怎么开始的——尽管我怀疑这与在构造函数末尾泄漏“this”有关。您的初始化方法是否启动额外的线程来执行其工作?在我看来,在尝试修复之前,您应该确切地了解发生了什么事情,而仅仅暂停一段时间对我来说似乎是个坏主意。

正如您所指出的,您应该在
同步的
块中调用
wait()
。默认情况下,同步意味着您锁定了此
,因此实际上是在对象完全构建之前发布对象-这是一个非常糟糕的想法

但是-正如@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;
  }
}
请注意,构造函数被声明为
private
,以确保创建新实例的唯一方法是通过
createAndPublish()

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

并非如其他人所指出的那样


但是您可以将构造函数代码分为两部分。在构造函数中创建GUI之前,完成可以安全完成的部分。在
初始化
()方法中执行必须等待GUI创建的部分,该方法可以在GUI创建后调用。

您的意思大概是
通知
,而不是
脉冲
-问题标记为Java.im试图找到什么;这正在进行,但从第一眼看,我似乎还没有在gui之前初始化对象。所以我试着停下来看看,说实话,因为我以前从来没有用过。wait()似乎更容易理解:/BTW:使用wait(200100)与wait(200)是一样的。等待(m,n)是毫无意义的IMHO。是的,你是对的,Peter,我刚刚测试了它。thnx的注意事项,你试图多线程的GUI API是什么?你的意思是
Thread.sleep
而不是
wait
?将
这个
放在方法调用前面的目的是什么?@Steve Kuo。修正了thanx。只是因为快速。静态工厂方法?你能再描述一下吗。我从来没听说过这件事。我是java新手,所以我在我的构造函数中使用这个例子?@FILIaS,不是,而不是构造函数。查看我的扩展示例,“执行必须等待GUI在initialize()方法中创建的部分,该方法可以在GUI创建后调用”。。。GUI创建之后???为什么之后?
MyClass newInstance = MyClass.createAndPublish();