2015-11-04 3 views
0

Я хочу, чтобы ThreadPool выполнял заказы клиентов, несколько заказов обрабатывались параллельно, но для тех же заказов клиентов должны обрабатываться в сгенерированной последовательности. Это означает, что если какая-либо нить уже обрабатывает заказ клиента, тогда ни один другой поток не сможет обработать следующий заказ CustomerA до обработки первого заказа.Выполнение подобных задач последовательно с ThreadPool

Есть ли варианты ThreadPool, которые служат моему случаю?

+0

Встроенные из них не имеют, что из коробки, но вы можете легко настроить их, чтобы поддержать это. – Kayaman

ответ

1

Я не думаю, что существуют такие стандартные функциональные возможности ThreadPools. Вам нужно создать «диспетчер», который будет «назначать потоки» из пула для заказов клиентов. Он должен сохранить внутреннюю карту unique order id -> thread. Если есть заказ при обработке новых обновлений, этот заказ должен ждать.

Для этой задачи вы должны изучить модель актера (и akka - как ее реализация). Это позволяет легко описать это решение.

0

Простая реализация:

public class CustomerOrderedExecutor { 
    private final Map<Integer, Executor> executors; 
    private final int poolSize; 

    public CustomerOrderedExecutor(int poolSize) { 
     this.poolSize = poolSize; 
     ImmutableMap.Builder<Integer, Executor> builder = ImmutableMap.builder(); 
     for (int i = 0; i < poolSize; i++) { 
      builder.put(i, Executors.newSingleThreadExecutor()); 
     } 
     executors = builder.build(); 
    } 

    void execute(Runnable command, int customerId) { 
     executors.get(customerId % poolSize).execute(command); 
    } 
} 
Смежные вопросы