2014-06-26 50 views
-2
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(); 
     } 
    } 
} 

據我可以告訴在這個控制檯程序再次使用thread1新的是合法的,它似乎工作正常。據我所知,thread1被第二次調用new所覆蓋。我可以得到一些驗證,再次使用新的方法是有效的嗎?再次在C中使用新的對象#

謝謝...

回答

4

是的,沒有。

每當您使用new時,您正在創建一個新對象,並將引用存儲到變量中的該對象。

所以

thread1 = new Thread(...) 

使得Thread一個新的實例,並存儲在thread1該實例的引用。


當你做它第二次

,要製作一個Thread第二個實例,但你不破壞舊的。您只是覆蓋參考,這只是線程的「地址」。但是,你確實有垃圾收集器,如果你沒有對它的引用,它將清理第一個線程,所以如果你的第一個線程引用了你的第一個線程(比如你將它分配給其他變量) ,它不會收集垃圾。

+0

那麼運行GC.Collect可能會有幫助嗎? – Giuseppe

+1

@ user2209542不,它不會幫助。即使您運行GC.Collect,如果仍然存在對該線程的引用,它將不會被收集。我個人喜歡避免手動垃圾收集,讓垃圾收集器做它的事情。 –

+0

所以沒有其他的參考只有thread1所以你必須說沒有問題,在這種情況下thread1將被垃圾收集。 – Giuseppe

2

如果「有效」你的意思是「會編」和「將覆蓋我的變量」,那麼是的,這是有效的。

然而,它是危險的。通過覆蓋變量,如果您想對其執行Join或其他任何操作,則會丟失對該變量的引用。如果您等待線索Join,順便說一下,這是一個安全的操作。

+0

*旋轉等待。自旋鎖是不同的。 – dcastro

+0

@dcastro,優點。自旋鎖用於避免競爭條件。旋轉等待會浪費CPU週期等待其他事情完成。 – BradleyDotNET