我想要一个ThreadPool来执行客户订单,多个订单应该并行处理,但对于相同的客户订单应该按生成的顺序处理。 这意味着如果任何线程已经处理了customerA订单,那么在处理第一个订单之前,没有其他线程可以处理CustomerA的下一个订单。
是否有任何支持我案例的ThreadPool实现?
答案 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);
}
}