要实现这个功能,你可以使用一个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。

注意:上述代码只是一个简单示例,实际使用时可能需要根据具体需求进行修改和完善

java 线程池队列 针对于每一个用户有一个key 如果当前用户未执行完成后面再进来的直接舍弃

原文地址: https://www.cveoy.top/t/topic/hyYD 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录