Вкратце, да, GC учитывает ссылку, хранящуюся в классе MyThread
, и не удаляет ссылочный объект. Это связано с тем, что Javaсборщик мусора будет уничтожать только недоступные объекты, то есть объекты, на которые нет ссылок нигде в вашем коде (не совсем общее правило, посмотрите на слабые ссылки ).
Переменнаяfoo
не фактический объект, а скорее ссылка на него.Когда вы передаете foo
конструктору MyThread
, вы передаете не объект, а ссылку на него.Внутри конструктора вы копируете эту ссылку и сохраняете ее внутри переменной-члена MyThread
.Так как метод run()
этого класса будет выполняться «навсегда» (что означает, что экземпляр MyThread
«жив»), рассматриваемая ссылка будет жить «навсегда», тем самым предотвращая сборку мусора ссылочным объектом.
Обратите внимание, что имя MyThread
неверно, так сказать.Он не распространяется Thread
и, следовательно, не является потоком.Это просто реализация интерфейса Runnable
.Более точное имя будет MyRunnable
.