Java 执行器服务:按键进行FIFO排序

Java 执行器服务:按键进行FIFO排序,java,concurrency,java-threads,Java,Concurrency,Java Threads,我正在寻找使ExecutorService由对象(键)进行FIFO排序的方法,即 对于给定的密钥,事件将按照它们到达的顺序进行处理 对于给定的密钥,一次只处理一个事件 内蒂3号有一个电话号码,但和内蒂有联系 番石榴有,但不清楚它是否能保证先进先出 我可以使用类似的方法锁定密钥,但为了保证FIFO,我必须冒着在调度程序线程中争用的风险 这个问题有什么通用的解决方案吗?如果你想简单,我会使用很多这样的FIFO执行器 static final int executors = Runtime.getRu

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

  • 对于给定的密钥,事件将按照它们到达的顺序进行处理
  • 对于给定的密钥,一次只处理一个事件
  • 内蒂3号有一个电话号码,但和内蒂有联系

    番石榴有,但不清楚它是否能保证先进先出

    我可以使用类似的方法锁定密钥,但为了保证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保持忙碌,而无需锁定。

    使用Akka actors(比
    ExecutorService
    稍微复杂一点,但您的需求是内置的)。这是有意义的。是否有任何理由在Math.abs()上使用&0x7FFF\u FFFF?@bcoughlan是的,Math.abs(Integer.MIN\u VALUE)==Integer.MIN\u VALUE,这将是40亿次中的1。i、 e.难以通过测试发现。