new Thread()和垃圾回收
本文关键字:Thread new | 更新日期: 2023-09-27 18:21:31
我有以下代码:
new Thread(new ThreadStart(delegate()
{
while (true)
{
//something
}
})).Start();
垃圾收集器是否可以在Thread
处于Running
状态时完成该实例?
否;正在运行的线程算作根。将不会收集正在运行的线程,也不会收集该线程的堆栈的活动部分引用的任何内容。
线程不会被收集,因为每个正在运行、等待或挂起的线程本身都由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。因此,它们只有在完成(完成执行)时才会被垃圾收集,或者在应用程序关闭时被删除。