Ответ 1
CLR отслеживает все запущенные потоки. Пока есть ссылки на объекты, они не будут собирать мусор. И поскольку CLR сохраняет ссылку на все запущенные потоки, GC не будет трогать их.
У меня есть следующий код:
new Thread(new ThreadStart(delegate()
{
while (true)
{
//something
}
})).Start();
Может ли сборщик мусора завершить этот экземпляр Thread
, пока он находится в состоянии Running
?
CLR отслеживает все запущенные потоки. Пока есть ссылки на объекты, они не будут собирать мусор. И поскольку CLR сохраняет ссылку на все запущенные потоки, GC не будет трогать их.
Нет; текущие потоки считаются корнями. Текущая нить не будет собрана и не будет ссылаться на активную часть стека для этого потока.
Нить не будет собираться, потому что каждый исполняемый, ожидающий или приостановленный поток сам использует GC для определения того, что является живым (трассируйте все в каждом поточном стеке, трассируйте все, на что ссылаются все эти объекты, тогда все ссылки теми и т.д., и вы определили все, что невозможно собрать мусором).
Поток может завершиться, если это был фоновый поток, потому что тогда он будет активно закрыт, когда все остальные потоки процесса закончатся. В противном случае единственное, что может заставить его умереть, - это активный процесс, исключение (включая ThreadAbortException
) или его выход из цикла while
.
Там случай, который сопоставим в некотором роде, возможно, это то, о чем вы думаете:
var timer = new System.Threading.Timer(someCallback, null, new TimeSpan(0, 0, 5), new TimeSpan(0, 0, 5));
int someResult = doingSomethingElse();
doSomethingElseThatTakesLongerThan5Seconds();
Это еще один фрагмент кода, который заставляет другой поток выполнения что-то делать. В этом случае таймер может действительно быть сборкой мусора перед запуском, во время одного из прогонов или почти в любое время после возвращения конструктора.
Важно то, что для таймера нет отдельного потока, и нить даже не знает об объекте таймера. Поскольку последний доступ к объекту с тех пор произошел, он имеет право на сбор. Это отличается от вопроса об отдельном потоке, который работает (или ждет и т.д.).