我可以依赖Java的垃圾收集(Groovy)多少钱?

时间:2011-11-02 12:02:01

标签: java groovy garbage-collection

我在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的垃圾收集上下注多少,以确保很快就能清除已停止/中断的线程?或者这个多线程对象问题是否有更好的解决方法?

3 个答案:

答案 0 :(得分:5)

您不需要interrupt()

在Java中,线程在run()方法完成时结束(通常通过返回或异常抛出异常)。

这意味着只要执行第二次setText()来电,Thread就会停止运行。因为没有别的东西引用了创建的Thread对象,所以它迟早会被垃圾收集。

答案 1 :(得分:2)

您在ED​​T之外使用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 . . . ."
      }
    }
  }
}

部分取自MultiThreading with SwingBuilder example

答案 2 :(得分:0)

Java Garbage集合将释放Thread使用的空间,至少在另一个Object需要它时。你不必关心它何时发生,如果你需要空间,你就得到它。