Java: нужно ли защищать объект Thread от сборщика мусора? - PullRequest
3 голосов
/ 18 марта 2011

После

{
Thread t = new Thread();
t.start();
}

является ли объект Thread кандидатом на сборщик мусора?

Ответы [ 3 ]

6 голосов
/ 18 марта 2011

Нет, его нельзя использовать для сбора мусора.Поскольку поток запланирован в очереди для выполнения Планировщиком потока (после вызова t.start( )), он не будет иметь права на сборщик мусора.

Один из способов проверить, работает ли поток по-прежнему или нет, - вызвать thread.isAlive().

final boolean isAlive( )

Метод isAlive( ) возвращает true, если поток, в котором он вызывается, все еще работает.В противном случае возвращается false.В вашем случае вы всегда можете вызвать метод t.isAlive(), просто чтобы проверить, жив ли поток или нет.

Когда поток останавливается или заканчивает свой жизненный цикл или еще не запланирован к запуску (как фрагмент кода Джона), то он имеет право на GC.

5 голосов
/ 18 марта 2011

Если он запущен, он не имеет права на сборщик мусора - код, который работает, может запросить Thread.currentThread(), в конце концов.

Если вы только что создали его, но не запустили, например:

{
    Thread pointless = new Thread();
}

тогда я подозреваю, что будет иметь право на GC - но довольно необычно создавать поток без его запуска. (Я полагаю, что исключение может быть выдано до того, как вы приступите к его запуску ...)

0 голосов
/ 18 марта 2011

Вам нужно защищать поток, только если вы хотите сохранить его после его завершения.Он не может быть скопирован GC во время работы (или чего-либо, что использует поток)

...