1

GoalОбработка изоляции пула потоков?

Я хочу понять, как обрабатывать два пула потоков одновременно в java?


Рассмотрите систему клиентских серверов, в которой клиенты отправляют на сервер блокирующие запросы ввода-вывода (например, файловый сервер). На сервере работает один экземпляр ThreadPoolExecutor. Некоторые запросы клиентов требуют гораздо больше времени для обработки, чем другие запросы. Эти запросы называются высокими запросами интенсивности ввода-вывода. Эта высокая интенсивность ввода-вывода требует опрокидывания всех потоков и уничтожения всего приложения.


Я хочу решить эту проблему двумя отдельными ThreadPoolExecutor. Я создаю два экземпляра ThreadPoolExecutor, один для запросов высокой интенсивности ввода-вывода и другой для запросов с низкой интенсивностью ввода-вывода, а также через автономную рабочую процедуру. Я создаю таблицу поиска для классификации запросов, и когда приходит запрос, я сначала просматриваю его класс в так что я могу передать его в соответствующий пул потоков.


Реальная проблема. Как распределять процессоры поровну с этими двумя пулами потоков. Будет ли эта задача решаться самим JVM, или я должен сам ее обработать на уровне приложения? Должен ли я использовать кластер и использовать другую машину, которая запускает экземпляр ThreadPoolExecutor для обработки запросов высокой интенсивности ввода-вывода? Просьба дать мне правильные дизайнерские предложения.

+0

Вы не можете решить, сколько ресурсов обрабатываются для потоков, это решение ядра, а не ваша (к счастью). Но вы можете отдать приоритет тем. – m0skit0

+0

Вы посмотрели на [Striped Executor] профессора Кабуца (http://www.javaspecialists.eu/archive/Issue206.html). Похоже, он будет делать то, что вам нужно, или, по крайней мере, вариант этого. – OldCurmudgeon

ответ

0

Как правило, до системного планировщика CPU распределяется время между потоками. Пул потоков не имеет ничего общего с планированием потоков. Он может управлять некоторыми потоками, использующими или синхронизирующими между собой.

Единственное преимущество создания 2 пулов вместо 1 состоит в том, что один пул может использовать ThreadFactory, отличный от стандарта Executors.defaultThreadFactory(). Вы можете отдавать предпочтение своим требовательным клиентам. Prority - это информация о том, что они будут страдать еще больше, если вы сделаете их менее важными или наоборот;)

Возможно, вы могли бы сделать что-то вроде настройки, это приоритет, когда кто-то использует слишком много ресурсов.

Here - это какая-то ссылка, как Microsoft использует приоритеты для настройки потребления ЦП потоков.

0

Нет JVM не может перенаправить ThreadPoolExecutor для вас. Вы можете реализовать поток внешнего наблюдателя, который отслеживает ваши потоки и применяет к ним соответствующую политику (приоритет, обработка исключений и т. Д.).

Взгляните на этот пример:

http://tutorials.jenkov.com/java-multithreaded-servers/thread-pooled-server.html