Какой смысл этой спящей нити
Я сейчас прохожу код, который не мой. В коде есть нить со следующим кодом:
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 для того, чтобы дать действительно хороший ответ.
3 ответа
Давайте проигнорируем опубликованный вами код, поскольку он не будет компилироваться, и просто сосредоточимся на том, служит ли поток, который спит вечно, какой-либо цели.
Есть три причины, по которым я могу придумать нить, чья работа - спать, ни одна из них не является особенно законной.
Ничего не делать
Нить может существовать, чтобы делать ничего значимого, навсегда. Если кто-то поручил вам работу по созданию потока, который не должен делать ничего осмысленного, вы могли бы придумать этот код.
Чтобы сохранить CLR/ процесс живой
Если это поток переднего плана, поток будет поддерживать процесс и CLR, даже если основной поток завершит работу. Из MSDN:
Управляемый поток - это фоновый поток или поток переднего плана. Фоновые потоки идентичны приоритетным потокам с одним исключением: фоновый поток не поддерживает работу среды управляемого выполнения. Как только все потоки переднего плана были остановлены в управляемом процессе (где файл.exe является управляемой сборкой), система останавливает все фоновые потоки и завершает работу.
Остыть
Возможно, что связывая поток с помощью сна, другие потоки, которые могут выполнять значимую работу, запускаются не так часто (например, если они запланированы в пуле потоков или в другой среде). Из The Daily WTF:
Из-за большого количества ускорений обработки данных у процессора больше нет шансов снизить скорость. На сервере скопилось тепло, контроллер вентилятора зажарен, а процессор приготовлен. В качестве альтернативы покупке избыточного охлаждения они заставили меня замедлить работу приложения до прежних уровней производительности со стратегически размещенными спящими режимами.
Код, как написано (кроме Sleep
с большой буквы), будет использоваться только для создания потока, который ничего не делает, и использует некоторую дополнительную память (для данных стека потока).
Возможно, поток был предназначен для выполнения какой-то другой функции, но, скорее всего, он должен был обрабатываться другим способом.
Из того, что вы нам показали, он просто создает нить и заставляет ее спать вечно. Без большего контекста мы не можем сказать вам больше ничего