Пул потоков, который связывает задачи для данного идентификатора с одним и тем же потоком

Существуют ли какие-либо реализации пула потоков (в Java), которые гарантируют, что все задачи с одним и тем же логическим идентификатором выполняются в одном потоке?

] Логика, которой я придерживаюсь, заключается в том, что если в конкретном потоке уже выполняется задача для данного логического идентификатора, то новые задачи с тем же идентификатором планируются в том же потоке. Если нет потоков, выполняющих задачу для того же идентификатора, то можно использовать любой поток.

Это позволит выполнять задачи для несвязанных идентификаторов параллельно, но задачи для одного и того же идентификатора будут выполняться последовательно и в представленном порядке.

Если нет, есть ли какие-нибудь предложения о том, как я мог бы расширить ThreadPoolExecutor , чтобы добиться такого поведения (если это вообще возможно)?

ОБНОВЛЕНИЕ

Потратив больше времени на размышления об этом, я не стал ' На самом деле требуется, чтобы задачи с одним и тем же логическим идентификатором выполнялись в одном потоке, просто чтобы они не выполнялись одновременно.

Примером этого может быть система, обрабатывающая заказы для клиентов, в которой можно было бы обрабатывать несколько заказов одновременно, но не для одного и того же клиента (и все заказы для одного и того же клиента должны были обрабатываться по порядку ).

В настоящий момент я использую стандартный ThreadPoolExecutor с настраиваемой BlockingQueue , а также обертываю Runnable специальной оболочкой. Логика оболочки Runnable :

  1. Атомарная попытка добавить идентификатор к параллельному «запущенному» набору ( ConcurrentHashMap ), чтобы узнать, выполняется ли в настоящее время задача для того же идентификатора {{1 }}
    • если добавить не удалось, вернуть задачу обратно в начало очереди и немедленно вернуть
    • в случае успеха продолжить
  2. Выполнить задачу
  3. Удалить связанный идентификатор задачи из «выполняется» set

Методы очереди poll () затем возвращают только те задачи, идентификатор которых в настоящий момент отсутствует в наборе «выполняется».

Проблема в том, что я уверен, что будет много угловых случаев, о которых я не думал, поэтому потребуется много тестирования.

16
задан SimonC 18 November 2011 в 02:31
поделиться