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)
会减少该计数器
我正在尝试解决与 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)
会减少该计数器