如何按特定键的顺序处理事件
How to process events in order for a specific key
我没有为我的问题找到合适的问题标题。
我有一个接收事件的侦听器,每个事件都有一个 object id。因为有些动作需要一些时间来处理,所以我切换到固定线程池执行器(有 10 个线程)的同步处理(我一次处理每个事件,锁定侦听器)。
问题是对于特定的 object id,我仍然想按照事件发出的相同顺序处理事件。
问题是 object id 是随机的,我不能 pre-declare 每个 object id 一个线程。
如果我想简化它:假设我有一个线程数组,id 为 0 的每个事件将通过索引 0 处的线程处理,对于 1 的每个事件,它们将通过索引 1 处的线程处理.
如果 id 在一个范围内,比如 0 到 10,它工作得很好,但我的情况不是这样,它们可以有任何 int 值。
要处理对象 ID 的事件,您需要确保它进入同一线程进行处理。为此,您可以计算对象 ID 的哈希值,然后根据您拥有的线程数 mod 它,这将确保相同的对象 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);
我没有为我的问题找到合适的问题标题。
我有一个接收事件的侦听器,每个事件都有一个 object id。因为有些动作需要一些时间来处理,所以我切换到固定线程池执行器(有 10 个线程)的同步处理(我一次处理每个事件,锁定侦听器)。
问题是对于特定的 object id,我仍然想按照事件发出的相同顺序处理事件。
问题是 object id 是随机的,我不能 pre-declare 每个 object id 一个线程。
如果我想简化它:假设我有一个线程数组,id 为 0 的每个事件将通过索引 0 处的线程处理,对于 1 的每个事件,它们将通过索引 1 处的线程处理.
如果 id 在一个范围内,比如 0 到 10,它工作得很好,但我的情况不是这样,它们可以有任何 int 值。
要处理对象 ID 的事件,您需要确保它进入同一线程进行处理。为此,您可以计算对象 ID 的哈希值,然后根据您拥有的线程数 mod 它,这将确保相同的对象 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);