Последовательное выполнение аналогичных задач с помощью ThreadPool

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

Существуют ли какие-либо реализации ThreadPool, которые подходят для моего случая?


person ravthiru    schedule 04.11.2015    source источник
comment
Встроенные не имеют этого из коробки, но вы можете легко настроить их для поддержки этого.   -  person Kayaman    schedule 04.11.2015


Ответы (2)


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

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

person vvg    schedule 04.11.2015

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

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);
    }
}
person Anatoly Deyneka    schedule 04.11.2015