java - 执行器服务 : FIFO ordering by key

标签 java concurrency java-threads

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

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

Netty 3 有 OrderedMemoryAwareThreadPoolExecutor但它与 Netty 相关。

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

我可以使用类似 JKeyLockManager 的方式锁定 key 但为了保证 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 都处于忙碌状态,而无需锁定。

关于java - 执行器服务 : FIFO ordering by key,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36870564/

相关文章:

java - 使用 Eclipse 调试器调试 Eclipse CDT 时出现奇怪的行为

java - JFrame 和可见性 : issue with fading out and getting a screenshot

java - 用于模型库测试的 UML 建模

java - 输入流到 int 数组

c++ - 使用加载链接/存储条件来防止 ABA 的无锁 C++11 示例?

java - 将参数从父级传递给 public void run()

java - 从线程中读取数据(在 Servlet 中)

java - Spring mongo 线程安全

java - 当用户退出Java控制台应用程序时如何正确拦截和处理?

java - 如何重写类对象本身的finalize()方法?