并发性我们可以在构造函数上使用wait()方法吗?JAVA
我们可以在构造函数上使用wait()方法吗? 我有一个构造函数方法,在这个方法中,我调用了一些其他的初始化方法和gui的方法。但是,它必须在第一个方法之前加载gui。因此,它会给尚未初始化的对象带来错误。我试图在gui调用之前使用wait(),但出现了一个非法MonitorStateException错误,因为它不在同步块中
试图做那样的事:
dice = new Dice();
this.generateBoard();
this.generateCells();
this.wait(200,100); //otherwise??
//GUI
board = new GUI(this);
# 1 楼答案
并非如其他人所指出的那样
但是你可以把构造器代码分成两部分。在构造函数中创建GUI之前,完成可以安全完成的部分。执行必须等待GUI在
initialize
()方法中创建的部分,该方法可以在GUI创建后调用# 2 楼答案
嗯,你可以在构造函数中使用
wait
,你只需要在构造函数中的“this”上进行同步:然而,目前还不清楚引用的内容是什么,除非你在构造函数中将“this”泄露给了另一个线程中使用它的东西
老实说,我们完全不清楚这是怎么开始的——尽管我怀疑这与在构造函数末尾泄漏“this”有关。你的初始化方法会启动额外的线程来完成它们的工作吗?在我看来,在你试图修复它之前,你应该先弄清楚到底发生了什么,而仅仅停顿一段时间对我来说似乎是个坏主意
# 3 楼答案
正如您所指出的,您应该在
synchronized
块内调用wait()
。默认情况下,同步意味着锁定this
,因此实际上是在对象完全构建之前发布它——这是一个非常糟糕的想法但是——正如@Jon所指出的——即使你明确地锁定了一个不同于
this
的对象,你仍然需要提前将this
发布到另一个线程,以便wait()
有任何意义(否则谁能notify()
它呢?)。所以这个计划很有味道更好的替代方法是使用静态工厂方法完全构建对象,然后安全地发布它:
请注意,构造函数被声明为
private
,以确保创建新实例的唯一方法是通过createAndPublish()
: