java 线程池队列 针对于每一个用户有一个key 如果当前用户未执行完成后面再进来的直接舍弃
要实现这个功能,你可以使用一个ConcurrentHashMap来存储每个用户的key和对应的任务。在任务执行之前,先检查该用户的key是否已经存在于ConcurrentHashMap中,如果存在,则直接舍弃该任务;如果不存在,则将该任务添加到线程池中执行,并将该用户的key添加到ConcurrentHashMap中。
下面是一个简单的示例代码:
import java.util.concurrent.*;
public class UserThreadPool {
private static ConcurrentHashMap<String, Boolean> userTasks = new ConcurrentHashMap<>();
public static void main(String[] args) {
// 创建线程池
ExecutorService executorService = Executors.newFixedThreadPool(10);
// 模拟多个用户请求
for (int i = 0; i < 20; i++) {
String userKey = "user" + i;
Runnable task = () -> {
// 检查用户的key是否存在
if (userTasks.containsKey(userKey)) {
System.out.println("Discard task for user: " + userKey);
return;
}
// 添加用户的key到ConcurrentHashMap中
userTasks.put(userKey, true);
// 模拟任务执行
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 任务执行完成后,从ConcurrentHashMap中移除用户的key
userTasks.remove(userKey);
System.out.println("Task completed for user: " + userKey);
};
// 提交任务给线程池执行
executorService.submit(task);
}
// 关闭线程池
executorService.shutdown();
}
}
在上面的示例中,我们创建了一个固定大小为10的线程池,并模拟了20个用户请求。每个用户请求都会被封装成一个Runnable任务提交给线程池执行。在任务执行之前,会先检查该用户的key是否已经存在于ConcurrentHashMap中,如果存在,则直接舍弃该任务;如果不存在,则将该任务添加到线程池中执行,并将该用户的key添加到ConcurrentHashMap中。任务执行完成后,会从ConcurrentHashMap中移除该用户的key。
注意:上述代码只是一个简单示例,实际使用时可能需要根据具体需求进行修改和完善
原文地址: https://www.cveoy.top/t/topic/hyYD 著作权归作者所有。请勿转载和采集!