Java 执行器服务和速率限制器
我有一个调用第三方API的类。现在,我正在致力于实现,一次只能向第三方api发送10个请求 我曾想过使用一个带有固定线程池的executor服务,如下所示Java 执行器服务和速率限制器,java,multithreading,executorservice,Java,Multithreading,Executorservice,我有一个调用第三方API的类。现在,我正在致力于实现,一次只能向第三方api发送10个请求 我曾想过使用一个带有固定线程池的executor服务,如下所示 public class SimpleRateLimiter { private ExecutorService executorService = Executors.newFixedThreadPool(10); private static SimpleRateLimiter srl = new SimpleRateL
public class SimpleRateLimiter {
private ExecutorService executorService = Executors.newFixedThreadPool(10);
private static SimpleRateLimiter srl = new SimpleRateLimiter();
private SimpleRateLimiter() {}
public static SimpleRateLimiter getInstance() {
return srl;
}
public void doSomething() {
executorService.submit(new Runnable() {
@Override
public void run() {
// call to 3rd party api
}
});
}
public void terminate() throws Exception {
executorService.shutdown();
}
}
我的理解是因为池中只有10个工作线程,所以在任何时候都只能使用上述代码向第三方API发出10个请求。但这并不意味着Executor服务将拒绝所有其他请求。相反,它将接受所有请求,并在完成所处理任务的执行后将请求分配给工作线程
上述理解正确吗
我想使用[番石榴]()库来做你的工作会更容易 是的,如果您查看
执行器的实现,您的理解是正确的。newFixedThreadPool()
它返回ThreadPoolExecutor
的一个实例,带有无限阻塞队列
实现:
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
因此,关于您的问题,所有任务都将提交到线程池,一次只有10个线程将运行并调用API,其余线程将排队
相反,如果使用自定义ThreadPoolExecutor
和有界阻塞队列
实现(如ArrayBlockingQueue
)(具有预定义的容量)在这种情况下,如果所有线程都很忙且队列已满,并且您尝试提交另一个任务,则任务将被拒绝,而不是LinkedBlockingQueue
在您的代码中,
executorService.submit
将继续接受新任务(直到Integer.MAX\u VALUE
任务),但在给定时刻只有10个线程将运行。感谢链接。但是你能评论一下上面的代码吗?我正在学习executor服务,所以它会很有帮助。第三方API会返回什么吗?@Marichyasana是的
public LinkedBlockingQueue() {
this(Integer.MAX_VALUE);
}