ExecutorService:按键排序的FIFO

时间:2016-04-26 16:23:42

标签: java concurrency java-threads

我正在寻找方法使ExecutorService成为按对象(密钥)排序的FIFO,即

  1. 对于给定的密钥,事件将按其到达的顺序处理。
  2. 对于给定的密钥,一次只能处理一个事件。
  3. Netty 3有OrderedMemoryAwareThreadPoolExecutor,但它与Netty有关。

    Guava有EventBus,但不清楚它是否保证FIFO。

    我可以使用类似JKeyLockManager之类的东西来锁定密钥,但为了保证FIFO,我必须冒险在调度程序线程中进行争用。

    那里有解决这个问题的一般方法吗?

1 个答案:

答案 0 :(得分:3)

如果你想要简单,我会使用像这样的许多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忙碌,而无需锁定。