2013-04-20 82 views
-2

我通過一些代碼去的地步,現在是不是我的。在代碼中有一個與下面的代碼線程:這是什麼休眠線程

while (true) 
{ 
    Thread.sleep(int.MaxValue); 
} 

它還捕捉InterruptedException的,去右後衛進入死循環,所以循環甚至不能被打斷。

有誰知道爲什麼這個線程會存在,有什麼目的?

編輯:完整的代碼,一點點更多的上下文:

using IKVM.Attributes; 
using java.lang; 
using System; 
using System.Runtime.CompilerServices; 
namespace applicationNamespace 
{ 
internal sealed class DedicatedServerSleepThread : Thread 
{ 
    internal DedicatedServer theDecitatedServer; 

    [MethodImpl(MethodImplOptions.NoInlining)] 
    internal DedicatedServerSleepThread(DedicatedServer dedicatedServer) 
    { 
     this.theDecitatedServer = dedicatedServer; 
     base.setDaemon(true); 
     this.start(); 
    } 
    [MethodImpl(MethodImplOptions.NoInlining)] 
    public override void run() 
    { 
     while (true) 
     { 
      try 
      { 
       while (true) 
       { 
        System.Threading.Thread.Sleep(int.MaxValue); 
       } 
      } 
      catch (System.Threading.ThreadInterruptedException) 
      { 
      } 
     } 
    } 
    static DedicatedServerSleepThread() 
    { 
    } 
} 
} 

注意前面的代碼使用了一些非標準的庫,所以小寫的睡眠是有效的。特別是它使用了ikvm庫(基於java標準庫,並用於將java程序交叉編譯爲.net)

這是一個java服務器程序,我將其交叉編譯爲.net字節碼,然後進行反編譯。我不確定是否有人曾經見過一條專門用於睡覺的線程,如果是的話,原因是什麼。 ta.speot.is提供了一個非常好的答案。

+5

該碼位似乎超出了上下文,因此很難猜測爲什麼以及發生了什麼。您需要提供更多信息。 – timss 2013-04-20 01:03:56

+0

看起來毫無意義。代碼中沒有任何評論或文檔,是嗎? – Thilo 2013-04-20 01:04:18

+0

絕對沒有用處。 – slugster 2013-04-20 01:04:27

回答

3

讓我們忽略你發佈的代碼,因爲它不會編譯,只是專注於永遠睡一個線程是否提供任何目的。

有三個原因,我可以爲一個線程,他們的工作就是睡覺,他們都不是特別合理想到的。

什麼都不做

線程可能存在什麼都不做有意義的,直到永遠。如果有人責成你創建一個不應該做任何有意義的線程的工作,那麼你可能會想出這個代碼。

以保持CLR /工藝活着

如果它是一個前臺線程,該線程將保持過程和CLR活着,即使主線程完成。 From MSDN

託管線程是後臺線程或前臺線程。後臺線程與前臺線程相同,只有一個例外:後臺線程不保持託管執行環境的運行。一旦所有前臺線程在託管進程中停止(其中.exe文件是託管程序集),系統將停止所有後臺線程並關閉。

降溫

這有可能是通過把一個線程睡眠,其他線程可以做有意義的工作不頻繁啓動(例如,如果他們正在計劃一個線程池內部或其他環境)。 From The Daily WTF

由於大量的數據處理加速,cpu不再有機會減速。在服務器中建立的熱量,油炸的風扇控制器和cpu的烹飪。作爲購買冗餘散熱的替代方案,他們讓我的應用速度降低到之前的性能水平,並且在戰略上處於睡眠狀態。

+0

(+1)很好說:) – Pyromancer 2013-04-20 01:52:44

+0

我希望它不是爲了目的而寫的,但是知道代碼在很多地方都是可怕地寫的,如果是的話我不會感到驚訝。第2種可能是有道理的,但程序已經設置了Dmon(這是java的設置爲後臺線程的等價物),所以這個過程不會被保留。那麼我猜它是第3號。儘管我也認爲程序員以後可能想要添加多線程,並且構建它以保存點或其他東西。看起來它實際上是想出來的,並計劃在那裏,而不僅僅是愚蠢的。 – mirhagk 2013-04-20 12:13:33

1

從你向我們展示它只是創建一個線程,並使其永遠沉睡。沒有更多的上下文,我們不能告訴你任何其他的東西

+0

好的,謝謝,剛纔在反編譯的一個主要項目的源代碼中看到了這個。這似乎相當奇怪,我真的不明白爲什麼它存在,認爲有人可能知道。 – mirhagk 2013-04-20 01:43:38

3

所寫的代碼(除了Sleep大寫),將只用於使一個什麼都不做的線程,並佔用一些額外的內存(對於線程的堆棧數據)。

這有可能是該線程的目的是執行一些其他的功能,但它是有可能的東西,應該以另一種方式被處理。