Как было объяснено, работающие потоки по определению невосприимчивы к GC. GC начинает свою работу с сканирования «корней», которые считаются всегда достижимыми; корни включают глобальные переменные («статические поля» в Java-разговоре) и стеки всех запущенных потоков (можно представить, что стек запущенного потока ссылается на соответствующий экземпляр Thread
).
Однако вы можете сделать поток "демоном" (см. Thread.setDaemon(boolean)
). Поток демона собирает не больше мусора, чем поток не демона, но JVM завершается, когда все запущенные потоки являются демонами. Один из способов представить это состоит в том, что каждый поток, когда он завершает свою работу, проверяет, остались ли какие-то не запущенные потоки, не являющиеся демонами; если нет, завершающий поток вызывает вызов System.exit()
, который выходит из JVM (уничтожая работающие потоки демона). Это не проблема GC; таким образом, потоки распределяются вручную. Тем не менее, это то, как JVM может переносить полулегальные нити. Обычно используется для Timer
экземпляров.