我的要求是限制在任何时间点使用我的服务的线程数量。Executor服务在这里对我没有帮助,因为我的问题空间有点不同。让我用一个例子来解释。
我公开了一个REST API,它只做一件事。在运行中,我的控制器调用其中一个服务来执行作业。但我必须确保只有n个线程访问服务。这意味着线程/API访问将不断增长,但在某些地方,如果'n'个线程已经在使用该服务,我必须让它们等待。在执行结束时,我应该从服务获得响应,并返回到端点,然后返回到客户端。
如果我使用FutureTask和callable,我将如何以及在哪里编写.get()方法?因为我的线程将在数量上不断增长,并且本质上是动态的。
希望问题说明清楚,如果需要进一步说明,请告诉我。
3条答案
按热度按时间rxztt3cl1#
如果你只是想限制可以访问你的服务的线程的最大数量,那么你可以使用Bounded信号量,并提供最大数量的许可。以下是示例代码(假设您的服务是单例服务):
您必须确保只创建一个信号量示例。如果应用程序中可以有多个服务示例,那么将信号量设置为静态。
nr9pn0ug2#
您可以使用ExecutorCompletionService来完成此操作。只需创建一个ExecutorService,固定如下所述的线程数
现在使用此ExecutorService创建ExecutorCompletionService。
然后在提交任务后,您可以迭代并获得未来以及来自未来的作业结果。当你使用从ExecutorService返回的Future时,这不会阻塞线程。
rmbxnbpk3#