Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我能在多大程度上依赖Java';s垃圾收集(Groovy)?_Java_Groovy_Garbage Collection - Fatal编程技术网

我能在多大程度上依赖Java';s垃圾收集(Groovy)?

我能在多大程度上依赖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

我在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调用多次,这也意味着每次设置状态时都将创建一个新的线程对象。记住这一点,我在最后明确添加了一个
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组件的正确线程上运行