我们可以在构造函数上使用 wait() 方法吗? 我有一个构造函数方法,在其中调用一些其他初始化方法,并在 gui 的方法之后调用。但它似乎在第一个方法之前加载 gui。因此它会给尚未初始化的对象带来错误。我尝试在 gui 调用之前使用 wait(),但出现 IllegalMonitorStateException 错误,因为它不在同步块(synchronized block)中。
尝试做那样的事情:
dice = new Dice();
this.generateBoard();
this.generateCells();
this.wait(200,100); //otherwise??
//GUI
board = new GUI(this);
最佳答案
正如您所指出的,您应该在 synchronized
block 中调用 wait()
。默认情况下同步意味着您锁定 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;
}
}
请注意,构造函数被声明为私有(private)
,以确保创建新实例的唯一方法是通过createAndPublish()
:
MyClass newInstance = MyClass.createAndPublish();
关于java - 我们可以在构造函数上使用 wait() 方法吗? java ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4682851/