我正在尝试解决与Java多线程相关的任务。我考虑过使用带阻塞队列的线程池,但我不确定在我的情况下是否足够。
问题是请求的数量必须受到限制。
根据我的理解,在这个例子中线程池应该做得很好,但是阻塞队列呢?你不觉得一定有更好的解决办法吗?
我考虑过使用优先级阻塞队列来给最活跃的用户提供更低的优先级,但是与等待时间相关的优先级(旧的请求应该具有更大的优先级)也应该不断更新--这将导致队列的不断重新排序。
对于这样一个问题,有什么明确的解决办法吗?
发布于 2018-11-29 14:21:11
用个信号量怎么样。每个传入的请求都会尝试获取一个超时锁,然后您可以确保如果获得一个锁成功,请求将立即被处理。听起来怎么样?
信号量文档: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;
}如果每个用户id的数量小于允许的最大值,则增加其计数。
和习俗行动:
releaseUSerConnection(userId)会减少那个计数器吗
https://stackoverflow.com/questions/53540239
复制相似问题