java - 如何限制使用Java服务的线程数

标签 java multithreading threadpool executorservice futuretask

我的要求是限制在任何时间点使用我的服务的线程数量。执行器服务在这里对我没有帮助,因为我的问题空间略有不同。让我用一个例子来解释一下。

我公开了一个只完成一项工作的 REST API。我的 Controller 即时调用其中一项服务来执行作业。但我必须确保只有“n”个线程访问该服务。这意味着线程/API 访问将不断增长,但在某些地方,如果“n”个线程已经在使用该服务,我必须让它们等待。执行结束时我应该从服务获取响应并返回到端点,然后返回到客户端。

如果我使用 FutureTask 和 callable,我将如何以及在哪里编写 .get() 方法?因为我的线程数量将不断增长并且本质上是动态的。

希望问题陈述清楚,如果需要更多说明,请告诉我。

最佳答案

如果您只想限制可以访问您的服务的最大线程数,那么您可以使用有界信号量并可以提供最大许可数。 这是示例代码(假设您的服务是单例):-

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);

关于java - 如何限制使用Java服务的线程数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51550866/

相关文章:

java - 我在使用 sleep 时遇到问题?

python - 队列中的并行处理(在 Celery 中使用 Pool)

java - 如何从类名字符串中获取单例实例

java - 如果在单个方法中递增,static int 线程安全吗?

java - 如何隐藏数据透视表中而不是工作表中的特定列?

c# - 数千个并发数据包,ThreadPool vs BeginRead?

c# - 将连接释放回 MongoDB 连接池

java - 函数仅返回偶数

ios - 一段时间后 dispatch_queue_t 变慢

python - 如何在每次调用函数时缓存函数结果并更新缓存值?