Насколько я могу положиться на сборку мусора Java (Groovy)? - PullRequest
2 голосов
/ 02 ноября 2011

У меня есть строка состояния в приложении 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 секунд, и он вернется к состоянию, в котором говорится о ожидании действий пользователя.

Это работает правильно, но меня беспокоит то, что вышеупомянутый метод будет вызываться несколько раз из пользовательского интерфейса, что также означает, что новый объект Thread будет создаваться каждый раз, когда устанавливается состояние. Помня об этом, я явно добавил interrupt() в конце, так как хочу указать компилятору, что мне больше не нужен этот поток. А также, сколько я могу сделать ставку на сборку мусора Java, чтобы гарантировать, что остановленные / прерванные потоки будут скоро очищены? Или есть лучший способ решить эту проблему с несколькими объектами потока?

Ответы [ 3 ]

5 голосов
/ 02 ноября 2011

Вам не нужен interrupt().

. В Java поток завершается, когда завершается метод run() (обычно при возврате или ненормально при выдаче исключения).

Это означает, что как только ваш второй вызов setText() будет выполнен, Thread прекратит работу.И поскольку ничто другое не ссылается на созданный объект Thread, он рано или поздно будет подвергнут сборке мусора.

2 голосов
/ 02 ноября 2011

Ваш код неверен, так как вы используете Swing вне EDT

Поскольку вы уже используете 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 с SwingBuilder

0 голосов
/ 02 ноября 2011

Сборка мусора Java освободит пространство, используемое вашим потоком, по крайней мере, когда это необходимо для другого объекта.Вам не нужно заботиться о том, когда это произойдет, если вам нужно место, вы его получите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...