-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()
    {
    }
}
}

请注意,前面的代码使用了一些非标准库,因此小写的 sleep 是有效的。具体来说,它使用的是 ikvm 库(基于 java 标准库,用于将 java 程序交叉编译到 .net)

这是一个 java 服务器程序,我将其交叉编译为 .net 字节码,然后进行反编译。我不确定是否有人看到过出于任何原因专门用于睡觉的线程,如果有的话,原因是什么。ta.speot.is 给出了一个非常好的答案。

4

3 回答 3

3

让我们忽略您发布的代码,因为它不会编译,而只关注永远休眠的线程是否有任何用途。

对于一个工作是睡眠的线程,我可以想到三个原因,但没有一个是特别合理的。

什么都不做

该线程可能永远存在以做任何有意义的事情。如果有人让你创建一个不应该做任何有意义的事情的线程,你可能会想出那个代码。

保持 CLR/进程活跃

如果它是前台线程,即使主线程完成,该线程也会使进程和 CLR 保持活动状态。来自 MSDN

托管线程要么是后台线程,要么是前台线程。后台线程与前台线程相同,但有一个例外:后台线程不会使托管执行环境保持运行。一旦托管进程中的所有前台线程都已停止(其中 .exe 文件是托管程序集),系统将停止所有后台线程并关闭。

冷静下来

有可能通过将线程与睡眠捆绑在一起,其他可以做有意义工作的线程不会被频繁启动(例如,如果它们被安排在线程池或其他环境中)。来自每日 WTF

由于一堆数据处理加速,cpu 不再有机会减速。服务器中积聚的热量,风扇控制器油炸,cpu煮熟。作为购买冗余冷却的替代方案,他们让我通过策略性地放置睡眠将应用程序降低到以前的性能水平。

于 2013-04-20T01:46:45.177 回答
3

编写的代码(Sleep大写除外)仅用于创建一个什么都不做的线程,并使用一些额外的内存(用于线程的堆栈数据)。

线程可能打算执行一些其他功能,但它可能应该以另一种方式处理。

于 2013-04-20T01:05:43.060 回答
1

从您向我们展示的内容来看,它只是创建了一个线程并使其永远休眠。没有更多上下文,我们无法告诉您其他任何信息

于 2013-04-20T01:04:07.173 回答