我正在尝试解决与Java多线程相关的任务。我曾考虑过将线程池与阻塞队列一起使用,但我不确定这在我的情况下是否足够。
问题是请求的数量必须受到的限制
根据我的理解,线程池在这个例子中应该做得很好,但阻塞队列呢?你不认为一定有更好的解决方案吗?
我曾考虑过使用优先级阻塞队列来为最活跃的用户提供较低的优先级,但与等待时间相关的优先级(较旧的请求应该具有更高的优先级(也应该不断更新——这将以不断的队列重新排序结束。
对于这样的问题,有没有明确的解决方案?
使用Semaphore怎么样。每个传入的请求都会尝试在超时的情况下获取锁,然后您可以确保,如果获取锁成功,请求会立即得到处理。听起来怎么样?
信号量文档: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)
将递减计数器