我现在正在阅读一些不属于我的代码。在代码中有一个包含以下代码的线程:
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给出了一个非常好的答案。
答案 0 :(得分:3)
编写的代码(除了Sleep
大写),只能用于创建一个什么都不做的线程,并占用一些额外的内存(用于线程的堆栈数据)。
该线程可能是为了执行某些其他功能,但它可能应该以另一种方式处理。
答案 1 :(得分:3)
让我们忽略你发布的代码,因为它不会编译,只关注一个永远休眠的线程是否有用。
我可以想到三个原因,一个线程的工作是睡觉,但没有一个是特别合法的。
什么都不做
线程可能存在,永远不会有意义。如果有人要求你创建一个不应该做任何有意义的线程的工作,那么你可能会想出那些代码。
保持CLR /流程
如果它是前台线程,即使主线程完成,线程也会使进程和CLR保持活动状态。 From MSDN:
托管线程是后台线程或前台线程。后台线程与前台线程相同,但有一个例外:后台线程不会使托管执行环境保持运行。一旦所有前台线程在托管进程中停止(其中.exe文件是托管程序集),系统将停止所有后台线程并关闭。
冷静下来
有可能通过将线程与睡眠联系起来,其他可以执行有意义工作的线程不会频繁启动(例如,如果它们被安排在线程池或其他环境中)。 From The Daily WTF:
由于大量的数据运算加速,cpu不再有机会降低速度。在服务器中建立的热量,风扇控制器炒和cpu的煮熟。作为购买冗余冷却的替代方案,他们让我通过策略性的睡眠将应用程序降低到以前的性能水平。
答案 2 :(得分:1)
从您向我们展示的内容中,它只是创建一个线程并使其永久睡眠。没有更多的背景,我们无法告诉你任何其他事情