我在Kotlin中有一个简单的应用程序,该应用程序绘制一个矩形,然后使用fixedRateTimer每秒更新该矩形的位置30次。我的问题是,当我关闭显示矩形的窗口时,应用程序将继续运行,并且必须按Intellij内的红色正方形才能真正停止它。
在关闭窗口之前,我曾尝试取消fixedRateTimer,但应用程序仍在运行,只是似乎没有任何作用。如果我在没有fixedRateTimer的情况下运行该应用程序,它将仅显示正方形,然后在关闭窗口时将其停止。
import javafx.scene.paint.Color
import tornadofx.*
import kotlin.concurrent.fixedRateTimer
class MyApp: App(MyView::class)
class MyView : View() {
override val root = stackpane {
group {
rectangle {
fill = Color.LIGHTGRAY
width = 600.0
height = 480.0
}
val myRect = rectangle {
fill = Color.BLUEVIOLET
width = 30.0
height = 30.0
x = 100.0
y = 100.0
}
fixedRateTimer("default", false, 0L, 1000/30) {
myRect.x += 1
if(myRect.x > 200) this.cancel()
}
}
}
}
答案 0 :(得分:2)
您要取消Timer任务,但不取消定时器。要么传递daemon = true
来创建守护线程,要么确保保存从Timer
调用返回的fixedRateTimer()
实例,并在某个时候调用cancel
以停止该守护进程。非守护进程线程在退出之前运行计时器。
有守护程序线程运行时,JVM将退出,但有非守护程序线程运行时,JVM将退出。