2013-08-09 4 views
1

У меня есть следующий код:ThreadPool.QueueUserWorkItem против новой темы

static void Main(string[] args) 
{ 
    Console.Write("Press ENTER to start..."); 
    Console.ReadLine(); 

    Console.WriteLine("Scheduling work..."); 
    for (int i = 0; i < 1000; i++) 
    { 
     //ThreadPool.QueueUserWorkItem(_ => 
     new Thread(_ => 
      { 
       Thread.Sleep(1000); 
      }).Start(); 
    } 
    Console.ReadLine(); 
} 

Согласно учебнику C# 4.0 развязанной Bart De Smet (стр 1466), используя новую тему должно означать использование гораздо больше потоков, чем если вы используйте ThreadPool.QueueUserWorkItem, который закомментирован в моем коде. Однако я пробовал и то, и другое в Мониторе ресурсов, которое имеет «новую тему», существует около 11 потоков, однако, когда я использую ThreadPool.QueueUserWorkItem, их около 50. Почему я получаю противоположный результат того, что упоминается в этой книге?

Также, почему, если вы увеличиваете время сна, вы получаете еще много потоков, выделяемых при использовании ThreadPool.QueueUserWorkItem?

+0

Вы не создадите ниги с кодом. Вам не нужен вызов «Thread.Start». –

+0

Я отредактировал мой вопрос. –

+0

А я вижу, вы обновляете код, не могли бы вы повторить свое тестирование и обновить наблюдаемые результаты? –

ответ

3

new Thread() просто создает объект Thread; вы забыли позвонить Start() (который создает фактический поток, который вы видите в мониторе ресурсов).

Кроме того, если вы просматриваете количество потоков после завершения сна, вы не увидите ни одного из new Thread, так как они уже вышли. С другой стороны, ThreadPool поддерживает поток в течение некоторого времени, поэтому он может повторно использовать их, поэтому в этом случае вы можете видеть потоки даже после завершения сна.

С new Thread() вы можете видеть, что число оставалось около 160, потому что потребовалось одну секунду, чтобы начать много потоков, поэтому к тому моменту, когда запускается 161-й поток, первый поток уже завершен. Если вы увеличиваете время сна, вы должны увидеть большее количество потоков.

Что касается ThreadPool, он предназначен для использования как можно большего количества потоков, а также для обеспечения занятости процессора. В идеале количество занятых потоков равно количеству ядер ЦП. Однако, если пул обнаруживает, что его потоки в настоящее время не используют CPU (спящий или ожидающий другого потока), он запускает больше потоков (со скоростью 1/секунду, до некоторого максимума), чтобы поддерживать загрузку процессора.

+0

Я тоже, спасибо, что выбрал это. –

+0

Почему это происходит, когда я использую .Start() метод, монитор ресурсов показывает приложение, использующее около 150 потоков, а затем через несколько секунд оно опускается до 11 потоков и остается постоянным на 11? –

+0

@ user2063755 Поскольку потоки завершаются. –

Смежные вопросы