namespace usenewagain
{
class Program
{
public static Thread thread1;
static void Main(string[] args)
{
thread1 = new Thread(() => threadsDelegate(TimeSpan.FromMinutes(1), 1) );
thread1.Start();
while(thread1.IsAlive)
{
}
thread1 = new Thread(() => threadsDelegate(TimeSpan.FromMinutes(2), 1));
thread1.Start();
while(thread1.IsAlive)
{
}
Console.WriteLine("Done...");
Console.ReadLine();
}
}
}
据我所知,在这个控制台程序中使用new on thread1再次是合法的,看起来它工作正常。据我所知,thread1被第二次调用new覆盖。我可以得到一些验证,再次使用new是有效的吗?
谢谢...
答案 0 :(得分:4)
是和否。
每次使用new
时,您都会创建一个新对象,并在变量中将引用存储到该对象。
所以
thread1 = new Thread(...)
创建Thread
的新实例,并在thread1
中存储对该实例的引用。
当你第二次这样做时,你正在制作Thread
的第二个实例,但你并没有破坏旧的实例。您只是覆盖了引用,这只是该主题的“地址”。
然而,你确实有垃圾收集器,如果没有对它的引用,它将清理第一个线程,所以如果在某个地方,对你的第一个线程的引用仍然存在,(就像你将它分配给其他变量一样),它不会被垃圾收集。
答案 1 :(得分:2)
如果“有效”是指“将编译”和“将覆盖我的变量”,那么是,它是有效的。
然而,这很危险。通过覆盖变量,如果要对其执行Join
或任何其他操作,则会丢失对它的任何引用。如果你等待线程Join
,顺便说一下你的旋转等待,这是一个安全的操作。