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

标签 java concurrency constructor wait

我们可以在构造函数上使用 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/

相关文章:

java - 改进 ExecutorService 以在超过 1 个 cpu 上执行进程

java - volatile jls 示例

c++ - 这是糟糕的风格吗?

java - 如何避免使用反射来创建新实例

java - 具有长参数列表或多个 setter 的构造函数?

java - H2、HSQLDB 或任何其他使用 InputStream 的嵌入式数据库

java - JLabel:异步加载 HTML 图像

java - 如何检测java程序中的内存压力?

asynchronous - 如何在 Rust 中竞赛 future 集合?

java - ConcurrentLinkedDeque 可以有固定大小并覆盖旧元素吗?