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

fnatzsnv  于 2023-05-21  发布在  Java
关注(0)|答案(3)|浏览(180)

我的要求是限制在任何时间点使用我的服务的线程数量。Executor服务在这里对我没有帮助,因为我的问题空间有点不同。让我用一个例子来解释。
我公开了一个REST API,它只做一件事。在运行中,我的控制器调用其中一个服务来执行作业。但我必须确保只有n个线程访问服务。这意味着线程/API访问将不断增长,但在某些地方,如果'n'个线程已经在使用该服务,我必须让它们等待。在执行结束时,我应该从服务获得响应,并返回到端点,然后返回到客户端。
如果我使用FutureTask和callable,我将如何以及在哪里编写.get()方法?因为我的线程将在数量上不断增长,并且本质上是动态的。
希望问题说明清楚,如果需要进一步说明,请告诉我。

rxztt3cl

rxztt3cl1#

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

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

nr9pn0ug2#

您可以使用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();

}
rmbxnbpk

rmbxnbpk3#

You can solve this by using both Semaphores and Future<T>. We have 2 types of Semaphores, i.e. Counting Semaphores and Binary Semaphores. If you want multiple threads to access your resource you, then use Counting semaphores.
Code example:

    public class RestrictApiCalls {
    private Sempaphore semaphore =  new Semaphore(3);
    private ExecutorService executor =  Executors.newFixedThreadPool(3);
    
     public void call(){
       try{
        semaphore.acquire();
        Future<String> future  =  executor.submit(()->{
         Thread.sleep(1000);
         return "Call successful";
        });
      try{
          String response  =  future.get();
        }catch(Exception e){
         //handle exception here
        }
     }catch(Exception e){
      // handle
    }
    finally{
     semaphore.release();
    }
    }
    }

    }

相关问题