new Thread()和垃圾回收

本文关键字:Thread new | 更新日期: 2023-09-27 18:21:31

我有以下代码:

new Thread(new ThreadStart(delegate()
{
    while (true)
    {
        //something
    }
})).Start();

垃圾收集器是否可以在Thread处于Running状态时完成该实例?

new Thread()和垃圾回收

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();

这是导致另一个执行线程执行某些操作的另一段代码。在这种情况下,计时器确实可以在运行前、某个运行期间或构造函数返回后的任何时间进行垃圾收集。

这里重要的是,计时器没有单独的线程,线程甚至不"知道"计时器对象。由于对象的最后一次访问已经发生,因此它有资格进行收集。这与正在运行(或等待等)的单个线程的情况不同

所有正在运行的定时器、线程、线程池和任务都标记为root。因此,它们只有在完成(完成执行)时才会被垃圾收集,或者在应用程序关闭时被删除。