Подтвердить что ты не робот

Один или несколько пулов потоков для Java-сервера?

Я пишу довольно сложное приложение Java-сервера, которое имеет значительную часть обработки фона в дополнение к обычной обработке запроса-ответа. Некоторые из фоновой обработки выполняются cron-подобным образом с использованием рамки Quartz. Другие задачи более востребованы - если новый клиент подключается, он создает дополнительное задание для его обновления через некоторое время. Задачи cron также могут варьироваться - некоторые выполняют мониторинг внешних приложений, некоторые рассчитывают статистику и т.д.

Я использую несколько пулов потоков для запуска всех этих заданий с идеей о том, что подобные задания будут совместно использовать пул потоков, но разные задания не будут делиться ими. Например, задания мониторинга никогда не будут выполняться в пуле статистики, а задания статистики никогда не будут выполняться в пуле мониторинга.

С другой стороны, я знаю, что некоторые люди предпочли бы просто иметь единственный пул потоков и запускать все на нем без какого-либо разделения.

Интересно, что считается наилучшей практикой в ​​таком сценарии.

Каковы преимущества минус разделение пулов потоков?

Это даже имеет значение?

4b9b3361

Ответ 1

Ответ зависит от того, нужно ли разделять ресурсы приложений между различными типами действий или нет.

Например, я в настоящее время пишу серверное приложение, состоящее из нескольких высокопроизводительных писателей и потенциально многих читателей. Читатели будут получать доступ к приложению спорадически, но могут запросить много данных (т.е. Длительные запросы). Мне нужно убедиться, что авторы никогда не голодают, поэтому я собираюсь использовать два пула потоков в своем дизайне для чтения/записи. Если пул потоков читателя временно исчерпан, авторы не будут затронуты; только запросы на чтение будут отложены.

Альтернативой могло бы быть использование PriorityQueue в сочетании с ThreadPoolExecutor и назначение более высокого приоритета для запросов на запись.

Итак, в заключение - Моим советом было бы: Начать с одного пула потоков и только сделать ваш проект более сложным, если есть конкретная причина для этого.

Ответ 2

Это не прямой ответ, но другое предложение: - (

Ваши задания на кварце могут быть приостановлены, отменены и т.д., позвольте называть его . Думаю, вы создадите некоторый пользовательский интерфейс, чтобы управлять ими.

Вы понимаете, что ваши другие задания ( "по требованию" ) не будут пользоваться теми же функциями, если вы не реализуете их, конечно? Считаете ли вы, что вы делаете все кварцевое задание (даже если оно начинается сразу), чтобы получить единый код?