我能在多大程度上依赖Java';s垃圾收集(Groovy)?
我在Swing应用程序中有一个状态栏,可以连续打印状态。应用程序中的所有对象和类都将使用此setStatus方法绘制状态栏我能在多大程度上依赖Java';s垃圾收集(Groovy)?,java,groovy,garbage-collection,Java,Groovy,Garbage Collection,我在Swing应用程序中有一个状态栏,可以连续打印状态。应用程序中的所有对象和类都将使用此setStatus方法绘制状态栏 public def setStatus(statusText){ Thread.start { ljaStatusBarButton.setText("Status : $statusText . . . .") sleep(3000) ljaStatusBarBu
public def setStatus(statusText){
Thread.start {
ljaStatusBarButton.setText("Status : $statusText . . . .")
sleep(3000)
ljaStatusBarButton.setText("Status : Waiting for user action . . . .")
interrupt() // or stop() ?
}
}
状态栏将显示状态3秒,并恢复为“等待用户操作”状态
这确实可以正常工作,但我担心的是,上面的方法将从UI调用多次,这也意味着每次设置状态时都将创建一个新的线程对象。记住这一点,我在最后明确添加了一个
interrupt()
,因为我想告诉编译器我不再需要这个线程了。另外,我可以在Java的垃圾收集上下多少赌注,以确保停止/中断的线程很快得到清理?或者对于这个多线程对象问题有更好的解决方法吗?您不需要中断()
在Java中,线程在run()
方法完成时结束(通常通过返回,或者异常地通过抛出异常)
这意味着一旦执行第二个setText()
调用,线程将停止运行。由于没有其他任何东西引用创建的线程
对象,因此它迟早会被垃圾收集。Java垃圾收集将释放线程使用的空间,至少在其他对象需要它时是如此。您不必关心它何时发生,如果您需要空间,您就可以得到它。您的代码不正确,因为您在EDT之外使用Swing
既然您已经在使用groovy,为什么不使用SwingBuilder帮助程序呢?这些帮助程序是为简化这类工作而添加的
import groovy.swing.SwingBuilder
...
public def setStatus( statusText ) {
// If we are not already on the EDT, static SwingBuilder.build(Closure) will do that for us.
// In the case of an event handler like the actionPerformed for the button, then naturally
// we're on the EDT already and the building will continue immediately.
SwingBuilder.build {
// doOutside will run the following code in our own thread
doOutside {
// Then change the swing components back on the EDT
edt {
ljaStatusBarButton.text = "Status : $statusText . . . ."
}
// So this sleep is in our own thread again (from doOutside)
sleep(3000)
// Then change the swing components back on the EDT
edt {
ljaStatusBarButton.text = "Status : Waiting for user action . . . ."
}
}
}
}
部分摘自旁注上的,如果这是Swing,那么除了Swing事件线程之外,您不应该修改任何东西上的Swing控件。看看SwingUtilities的invokeAndWait或invokeLater方法,了解如何从后台线程调用事件线程上的代码。这看起来很有说服力。现在,不管调用setStatus()多少次,只有EDT的一个实例处理它,对吗?我不必担心多线程实例,不是吗?@VeeKay你看过提供的链接了吗?我已经对代码进行了注释,以显示它正在做什么doOutside
将为您创建一个线程
,并且edt
块中的代码将在更新Swing组件的正确线程上运行