有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何按特定键的顺序处理事件

我没有为我的问题找到一个好的题目

我有一个接收事件的侦听器,每个事件都有一个对象id。因为一些操作需要一些时间来处理,所以我切换到一个同步处理(每次处理一个事件,锁定侦听器)到一个固定的线程池执行器(有10个线程)

问题是,对于特定的对象id,我仍然希望按照事件发出的相同顺序处理事件

问题是对象id是随机的,我不能为每个对象id预先声明线程

如果我想简化它:假设我有一个线程数组,每个id为0的事件都将通过索引0处的线程处理,对于每个id为1的事件,它们将通过索引1处的线程处理

如果id在一个范围内,比如0到10,它工作得很好,但这不是我的情况,它们可以有任何int值


共 (1) 个答案

  1. # 1 楼答案

    要处理对象ID的事件,您需要确保它正在进入同一个线程进行处理。要做到这一点,您可以计算对象ID的哈希值,然后根据您拥有的线程数对其进行修改,这将确保相同的对象ID由相同的线程或相同的线程池处理

    int objectIdHash = objectId.hashCode();
        
    return (objectIdHash % totalThreads);
    

    现在,要存储线程或线程池进行处理,可以使用并发HashMap

    // Define the thread pool
    private Map<Integer, ExecutorService> threadPool = new ConcurrentHashMap<Integer, ExecutorService>();
    
    // Get the thread id using the above
    int threadId = getJobThreadPoolId(objectId, totalThreads);
    
    // Get the thread from the threadpool and submit
    threadpool.get(threadId).submit(event);