Java 并发 - 线程池 - 多个请求和用户

Java concurency - thread pool- multiple requests and users

我正在尝试解决与 Java 多线程相关的任务。 我考虑过将线程池与阻塞队列一起使用,但我不确定它是否适合我的情况。

问题是必须限制请求的数量

根据我的理解,线程池在这个例子中应该做得很好,但是阻塞队列呢? 你不觉得一定有更好的解决办法吗?

我考虑过使用优先级阻塞队列来为最活跃的用户提供较低的优先级,但是与等待时间相关的优先级(较旧的请求应该具有更高的优先级)也应该不断更新——这将导致不断的队列重新排序.

是否有针对此类问题的明确解决方案?

使用信号量怎么样。每个传入请求都会尝试获取超时锁,那么您可以确定如果获取锁成功,请求将立即得到处理。听起来怎么样?

信号量文档: https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Semaphore.html

我将只使用一个信号量,因此信号量中的许可数实际上等于系统中允许的最大连接数。

至于每个用户的连接数,我会在信号量实现的 ConcurrentHashMap 中保留用户连接计数器,然后自定义

public boolean tryAcquire(long timeout, TimeUnit unit, Long userId)
    throws InterruptedException {
    AtomicLong connCount = userConnetctionMap.contains(userId) ? userConnetctionMap.get(userId) :  userConnetctionMap.put(userId, new AtomicLong(0));
    if (connCount.get() < MAX_USER_CONN_COUNT) {
        boolean locked = super.tryAcquire(timeout, unit);
        if (locked) {
            userConnetctionMap.get(userId).incrementAndGet();
            return true;
        }
    }
    return false;
}

如果他的 conn 数量小于允许的最大值,则增加每个用户 id 的计数

和自定义操作:

releaseUSerConnection(userId)

会减少该计数器