Java 在应用程序中从start()更改成员值并保存对ui组件的引用
我有以下自定义应用程序类实现。但是,我不明白为什么Java 在应用程序中从start()更改成员值并保存对ui组件的引用,java,multithreading,javafx,thread-safety,volatile,Java,Multithreading,Javafx,Thread Safety,Volatile,我有以下自定义应用程序类实现。但是,我不明白为什么isVisible的值没有改变。我试图将字段类型更改为simpleboleanproperty。然而,这并没有帮助。另外,我应该稍后访问ui,所以我想保存对它们的引用,但是,该值也没有设置。我尝试在start()方法中初始化ui组件,但是,在初始化之后,如果我看到我的字段,它将为null import javafx.stage.Stage import java.util.concurrent.atomic.AtomicBoolean clas
isVisible
的值没有改变。我试图将字段类型更改为simpleboleanproperty
。然而,这并没有帮助。另外,我应该稍后访问ui,所以我想保存对它们的引用,但是,该值也没有设置。我尝试在start()方法中初始化ui组件,但是,在初始化之后,如果我看到我的字段,它将为null
import javafx.stage.Stage
import java.util.concurrent.atomic.AtomicBoolean
class TestApplication : Application() {
@Volatile
private var isVisible = AtomicBoolean(false)
override fun start(stage: Stage) {
stage.show()
println("Stage shown ${Thread.currentThread().name}")
isVisible.set(true)
}
fun showUI() {
Thread { launch(TestApplication::class.java) }.start()
println("Waiting until getting visible")
while (isVisible.get().not());
println("isVisible=${isVisible}")
}
}
问题是创建TestApplication类的实例两次
Application.launch()
创建新实例,但不获取现有实例
解决方案可以是在TestApplication类上使用singleton模式。
Application.launch()
创建Application
子类的新实例,并在该新实例上调用start()
。(顺便说一句,这是什么语言?)。每个JVM实例只能调用launch
一次。另外,为什么不将isVisible
aval
并删除@Volatile
注释?(@James_D我是Kotlin)。我只是想测试资源共享。是科特林