我正在寻找使ExecutorService由对象(键)排序的FIFO的方法,即


对于给定的键,事件将按照它们到达的顺序进行处理。
对于给定的键,一次将仅处理一个事件。


Netty 3具有OrderedMemoryAwareThreadPoolExecutor,但它与Netty相关。

番石榴有EventBus,但不清楚是否保证FIFO。

我可以使用诸如JKeyLockManager之类的键锁定键,但是要保证FIFO,我将不得不冒着在调度程序线程中争夺的风险。

是否有针对此问题的一般解决方案?

最佳答案

如果您想要简化,我会使用许多这样的FIFO执行器

static final int executors = Runtime.getRuntime().availableProcessors() * 2;
ExecutorService[] executors = new ExecutorService[executors];
// fill with single threaded executors.

public Future submit(Object actorId, Runnable r) {
    int h = (actorId.hashCode() & 0x7FFF_FFFF) % executors;
    return executors[h].submit(r);
}


除非工作负载高度不平衡,否则这将使您所有的CPU忙碌,而无需锁定。

10-08 07:15