Java 执行器服务和速率限制器

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

我有一个调用第三方API的类。现在,我正在致力于实现,一次只能向第三方api发送10个请求

我曾想过使用一个带有固定线程池的executor服务,如下所示

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