【问题标题】:How to restrict the number of threads using a Java service如何使用 Java 服务限制线程数
【发布时间】:2019-01-04 03:50:24
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你可以使用ExecutorService,只需创建一个大小为n的单例线程池。然后对于每个请求,您可以提交并等待响应。这样一来,您将只有 n 线程访问您的服务。
  • @SukhpalSingh 如果我正在使用提交,我该如何等待响应?提交将返回 FutureTask 对!。为了从 FutureTask 对象中检索响应,我需要调用 future.get(),但是什么时候调用这就是问题所在! :(
  • 只在当时和那里调用它。每个 rest 调用都是从池中取出的一个新线程。
  • 如果我只在那个时候调用,futuretask.get() 可能会返回 null,因为任务需要一些时间才能完成,对吗?如果我遗漏了什么,请纠正我。
  • get() 在必要时等待计算完成,然后检索其结果。

标签: java multithreading threadpool executorservice futuretask


【解决方案1】:

您可以为此使用 ExecutorCompletionService。 只需创建一个具有固定线程数的 ExecutorService,如下所述

ExecutorService pool = Executors.newFixedThreadPool(5);

现在使用这个 ExecutorService 创建一个 ExecutorCompletionService。

ExecutorCompletionService completionService = new ExecutorCompletionService(pool);

然后在提交任务后,您可以迭代并获得未来以及未来的工作结果。当您使用仅从 ExecutorService 返回的 Future 时,这不会阻塞线程。

for(int i = 0; i < worker size ; i++) {
    Future future = completionService.take();

     Object content = future.get();

}

【讨论】:

    【解决方案2】:

    如果您只想限制可以访问您的服务的最大线程数,那么您可以使用 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);
    

    【讨论】:

    • 我的错!我应该首先想到信号量。很好的帮助
    猜你喜欢
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 2019-03-15
    相关资源
    最近更新 更多