首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java一致性-线程池-多个请求和用户

Java一致性-线程池-多个请求和用户
EN

Stack Overflow用户
提问于 2018-11-29 13:33:04
回答 1查看 154关注 0票数 0

我正在尝试解决与Java多线程相关的任务。我考虑过使用带阻塞队列的线程池,但我不确定在我的情况下是否足够。

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

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

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

对于这样一个问题,有什么明确的解决办法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-29 14:21:11

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

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

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

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

代码语言:javascript
复制
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的数量小于允许的最大值,则增加其计数。

和习俗行动:

代码语言:javascript
复制
releaseUSerConnection(userId)

会减少那个计数器吗

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53540239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档