Существуют ли какие-либо реализации пула потоков (в Java), которые гарантируют, что все задачи с одним и тем же логическим идентификатором выполняются в одном потоке?
] Логика, которой я придерживаюсь, заключается в том, что если в конкретном потоке уже выполняется задача для данного логического идентификатора, то новые задачи с тем же идентификатором планируются в том же потоке. Если нет потоков, выполняющих задачу для того же идентификатора, то можно использовать любой поток.
Это позволит выполнять задачи для несвязанных идентификаторов параллельно, но задачи для одного и того же идентификатора будут выполняться последовательно и в представленном порядке.
Если нет, есть ли какие-нибудь предложения о том, как я мог бы расширить ThreadPoolExecutor
, чтобы добиться такого поведения (если это вообще возможно)?
ОБНОВЛЕНИЕ
Потратив больше времени на размышления об этом, я не стал ' На самом деле требуется, чтобы задачи с одним и тем же логическим идентификатором выполнялись в одном потоке, просто чтобы они не выполнялись одновременно.
Примером этого может быть система, обрабатывающая заказы для клиентов, в которой можно было бы обрабатывать несколько заказов одновременно, но не для одного и того же клиента (и все заказы для одного и того же клиента должны были обрабатываться по порядку ).
В настоящий момент я использую стандартный ThreadPoolExecutor с настраиваемой BlockingQueue
, а также обертываю Runnable
специальной оболочкой. Логика оболочки Runnable
:
ConcurrentHashMap
), чтобы узнать, выполняется ли в настоящее время задача для того же идентификатора {{1 }} Методы очереди poll ()
затем возвращают только те задачи, идентификатор которых в настоящий момент отсутствует в наборе «выполняется».
Проблема в том, что я уверен, что будет много угловых случаев, о которых я не думал, поэтому потребуется много тестирования.