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

Java 如何按特定键的顺序处理事件,java,threadpool,Java,Threadpool,我没有为我的问题找到一个好的题目 我有一个接收事件的侦听器,每个事件都有一个对象id。因为一些操作需要一些时间来处理,所以我切换到一个同步处理(每次处理一个事件,锁定侦听器)到一个固定的线程池执行器(有10个线程) 问题是,对于特定的对象id,我仍然希望按照事件发出的相同顺序处理事件 问题是对象id是随机的,我不能为每个对象id预先声明线程 如果我想简化它:假设我有一个线程数组,每个id为0的事件都将通过索引0处的线程处理,对于每个id为1的事件,它们将通过索引1处的线程处理 如果id在一个范围

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

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

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

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

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


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

要处理对象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);
//定义线程池
私有映射线程池=新的ConcurrentHashMap();
//使用上述方法获取线程id
int-threadId=getJobThreadPoolId(objectId,totalThreads);
//从线程池中获取线程并提交
线程池.get(threadId).submit(事件);

要处理对象ID的事件,您需要确保该对象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);
//定义线程池
私有映射线程池=新的ConcurrentHashMap();
//使用上述方法获取线程id
int-threadId=getJobThreadPoolId(objectId,totalThreads);
//从线程池中获取线程并提交
线程池.get(threadId).submit(事件);

您能分享一些例子来帮助我们更好地理解吗?您的意思是您希望以顺序方式处理事件或并行处理事件,但具有相同顺序的事件应以顺序方式处理。我仍然希望以并行方式处理它们,但仅当对象id不同时,我希望按顺序处理两个具有相同id的事件您是否会等待更多事件来处理对象id,或者您将处理处理时可用的事件,以及在处理对象id期间收到事件时您希望执行的操作。事实上,我忘记了在事件内部提供此信息,有“开始”和“结束”事件,因此开始事件可能会创建一些内容,而结束事件将清除任何可能设置为处理这些事件的内容,这些事件被称为不是线程池。显式定义一个映射,并使用int和单个线程初始化它。收到任何事件后,获取对象ID并计算hashcode,然后根据您拥有的线程总数对其进行修改。这将确保您的同一个对象始终指向同一个线程。您能分享示例以帮助我们更好地理解吗?您的意思是您希望以顺序方式处理事件或并行处理事件,但具有相同顺序的事件应以顺序方式处理。我仍然希望以并行方式处理它们,但仅当对象id不同时,我希望按顺序处理两个具有相同id的事件您是否会等待更多事件来处理对象id,或者您将处理处理时可用的事件,以及在处理对象id期间收到事件时您希望执行的操作。事实上,我忘记了在事件内部提供此信息,有“开始”和“结束”事件,因此开始事件可能会创建一些内容,而结束事件将清除任何可能设置为处理这些事件的内容,这些事件被称为不是线程池。显式定义一个映射,并使用int和单个线程初始化它。收到任何事件后,获取对象ID并计算hashcode,然后根据您拥有的线程总数对其进行修改。这将确保同一对象始终转到同一线程。