如何使用 Java 服务限制线程数
How to restrict the number of threads using a Java service
我的要求是限制在任何时间点使用我的服务的线程数。执行者服务在这里没有帮助我,因为我的问题 space 有点不同。让我用一个例子来解释。
我公开了一个 REST API,它完成一项工作。在运行过程中,我的控制器调用其中一项服务来执行作业。但我必须确保只有 'n' 个线程访问该服务。这意味着 threads/API-access 将持续增长,但在某些地方,如果 'n' 线程已经在使用该服务,我必须让他们等待。在执行结束时,我应该从服务和 returns 返回到端点,然后返回到客户端。
如果我使用 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);
您可以为此使用 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();
}
我的要求是限制在任何时间点使用我的服务的线程数。执行者服务在这里没有帮助我,因为我的问题 space 有点不同。让我用一个例子来解释。
我公开了一个 REST API,它完成一项工作。在运行过程中,我的控制器调用其中一项服务来执行作业。但我必须确保只有 'n' 个线程访问该服务。这意味着 threads/API-access 将持续增长,但在某些地方,如果 'n' 线程已经在使用该服务,我必须让他们等待。在执行结束时,我应该从服务和 returns 返回到端点,然后返回到客户端。
如果我使用 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);
您可以为此使用 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();
}