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
a
val
并删除
@Volatile
注释?(@James_D我是Kotlin)。我只是想测试资源共享。是科特林