我正在尝试解决与Java多线程有关的任务。 我曾考虑过将线程池与阻塞队列一起使用,但不确定是否适合我的情况。
问题是必须限制请求数
据我了解,在该示例中线程池应该可以正常工作,但是阻塞队列又如何呢? 您是否认为必须有更好的解决方案?
我曾考虑过使用优先级阻止队列为最活跃的用户分配较低的优先级,但是优先级与等待时间有关(旧请求的优先级应该更高) )也应不断更新-这将导致队列不断重新排序。
是否存在针对此问题的已定义解决方案?
答案 0 :(得分:0)
如何使用信号量。每个传入的请求都将尝试获取具有超时的锁,然后您可以确保,如果成功获取锁,该请求将立即得到处理。听起来怎么样?
信号灯文档: 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)
减少该计数器