java - 如何使用 Java 服务限制线程数
问题描述
我的要求是限制在任何时间点使用我的服务的线程数。执行者服务在这里没有帮助我,因为我的问题空间几乎没有什么不同。让我用一个例子来解释。
我已经公开了一个可以完成一项工作的 REST API。在运行中,我的控制器调用其中一项服务来执行作业。但我必须确保只有“n”个线程访问该服务。这意味着线程/API 访问将不断增长,但在某些地方,如果“n”个线程已经在使用该服务,我必须让它们等待。在执行结束时,我应该从服务中获取响应并返回到端点,然后返回到客户端。
如果我使用 FutureTask 和 callable,我将如何以及在哪里编写 .get() 方法?因为我的线程将在数量和性质上不断增长。
希望问题陈述清楚,如果需要更多说明,请告诉我。
解决方案
如果您只想限制可以访问您的服务的最大线程数,那么您可以使用 Bounded Semaphore 并且可以提供最大许可数。这是示例代码(假设您的服务是单例的):-
public class SampleService {
private Semaphore semaphore = new Semaphore(n, true);
public void someMothod() {
try {
semaphore.acquire();
// execute the task
} catch (InterruptedException e) {
} finally {
semaphore.release();
}
}
}
您必须确保只创建一个信号量实例。如果您可以在应用程序中有多个服务实例,则将信号量设为静态。
private static Semaphore semaphore = new Semaphore(n, true);
推荐阅读
- javascript - 在每次执行时增加 setInterval 计时器
- php - 试图在 php 中通过页面链接传递值
- windows - Erlang 构建错误:未找到本机 ethread 实现
- django - 使用 Django Channels 从 celery 后台任务向浏览器发送消息
- python - 访问通过系统命令执行的R中python脚本的输出
- r - 用零填充数据框
- python - django 文件 style.css 找不到
- hbase - Hadoop 的 Amazon EMR 与 MapR 的 EMR
- javascript - 如何在使用 jquery 将表附加到 for 循环之前清空表的 HTML,
- amazon-web-services - Amazon Deeplens 设备注册成功后离线,无法部署项目