我在Swing应用程序中有一个持续打印状态的状态栏。应用程序中的所有对象和类都将使用此setStatus方法绘制状态栏
public def setStatus(statusText){
Thread.start {
ljaStatusBarButton.setText("Status : $statusText . . . .")
sleep(3000)
ljaStatusBarButton.setText("Status : Waiting for user action . . . .")
interrupt() // or stop() ?
}
}
状态栏将显示状态3秒,并恢复为等待用户操作的状态。
这确实可以正常工作但我关心的是上面的方法将从UI多次调用,这也意味着每次设置状态时都会创建一个新的Thread对象。记住这一点,我最后明确地添加了一个interrupt()
因为我想指示编译器我不再需要这个线程了。而且,我可以在Java的垃圾收集上下注多少,以确保很快就能清除已停止/中断的线程?或者这个多线程对象问题是否有更好的解决方法?
答案 0 :(得分:5)
您不需要interrupt()
。
在Java中,线程在run()
方法完成时结束(通常通过返回或异常抛出异常)。
这意味着只要执行第二次setText()
来电,Thread
就会停止运行。因为没有别的东西引用了创建的Thread
对象,所以它迟早会被垃圾收集。
答案 1 :(得分:2)
您在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 . . . ."
}
}
}
}
答案 2 :(得分:0)
Java Garbage集合将释放Thread使用的空间,至少在另一个Object需要它时。你不必关心它何时发生,如果你需要空间,你就得到它。