Основная потребность в потоках theadpool состоит в том, чтобы обрабатывать небольшие небольшие задачи, которые, как ожидается, завершатся почти мгновенно. Аппаратные обработчики прерываний часто выполняются в контексте стека, который не подходит для неядерного кода, но аппаратный обработчик прерываний может обнаружить, что обратный вызов завершения пользовательского режима должен быть запущен как можно скорее. Создание нового потока для запуска такой вещи было бы огромным излишним. Наличие нескольких предварительно созданных потоков, которые можно отправить для выполнения обратных вызовов завершения ввода-вывода или других подобных вещей, намного эффективнее.
Ключевым аспектом таких потоков является то, что если методы завершения ввода-вывода всегда завершаются практически мгновенно и никогда не блокируются, а количество таких потоков, в которых в настоящее время выполняются такие методы, по крайней мере, равно числу процессоров, то единственный способ любой другой поток может быть запущен до того, как закончится один из вышеупомянутых методов, если один из других методов блокирует или его время выполнения превышает нормальный временной поток; ни то, ни другое не должно происходить очень часто, если пул потоков используется по назначению.
Если нельзя ожидать, что метод завершится в течение 100 мс или около того, когда он начнет выполнение, метод должен выполняться другими способами, помимо пула основного потока. Если нужно выполнить много задач, которые интенсивно загружают ЦП, но не будут блокировать, может быть полезно распределить их с помощью пула потоков приложений (по одному на ядро ЦП), который отделен от «основного» пула потоков, поскольку использование большее количество потоков, чем ядер, будет контрпродуктивным при выполнении неблокирующих ресурсоемких задач. Однако если выполнение метода займет секунду или дольше и большую часть времени он будет заблокирован, метод, скорее всего, должен выполняться в выделенном потоке и почти наверняка не должен выполняться в потоке основного потока. Если длительная операция должна быть вызвана чем-то вроде обратного вызова ввода / вывода, нужно либо запустить поток для длительной операции до обратного вызова и заставить его ждать на мониторе, который пульсирует обратный вызов, либо пусть обратный вызов запускает новый поток для выполнения операции во время выхода обратного вызова, эффективно возвращая свой собственный поток в пул потоков.