2013-04-20 40 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大写),将只用于使一个什么都不做的线程,并占用一些额外的内存(对于线程的堆栈数据)。

这有可能是该线程的目的是执行一些其他的功能,但它是有可能的东西,应该以另一种方式被处理。