使用ThreadPool顺序执行类似的任务

时间:2015-11-04 09:54:55

标签: java threadpool java-threads

我想要一个ThreadPool来执行客户订单,多个订单应该并行处理,但对于相同的客户订单应该按生成的顺序处理。 这意味着如果任何线程已经处理了customerA订单,那么在处理第一个订单之前,没有其他线程可以处理CustomerA的下一个订单。

是否有任何支持我案例的ThreadPool实现?

2 个答案:

答案 0 :(得分:1)

我不认为ThreadPools有这样的标准功能。您需要做的是创建调度员'这将分配线程'从池到客户订单。它应该保存unique order id -> thread的内部地图。如果订单处理此订单的新更新,请等待。

对于这项任务,你应该研究演员模型(和akka - 作为它的实现)。它允许轻松描述此解决方案。

答案 1 :(得分: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);
    }
}