OkHttp中的ThreadPoolExecutor使用和异步操作的Retrofit的区别

时间:2014-05-27 21:38:39

标签: java retrofit threadpoolexecutor okhttp

OkHttp 2.0.0-RC1使用Dispatcher ThreadPoolExecutor中定义的#getExecutorService

executorService = new ThreadPoolExecutor(
  0, Integer.MAX_VALUE,
  60, TimeUnit.SECONDS,
  new LinkedBlockingQueue<Runnable>(),
  Util.threadFactory("OkHttp Dispatcher", false));`

基本上是Executors#newFixedThreadPool的实现。

另一方面,Retrofit使用Platform Executors.newCachedThreadPool中定义的#defaultHttpExecutor,归结为:

executorService = new ThreadPoolExecutor(
  0, Integer.MAX_VALUE,
  60, TimeUnit.SECONDS,
  new SynchronousQueue<Runnable>(),
  someThreadFactory);

任何人都有任何想法为什么OkHttp使用Executors#newFixedThreadPool和改造Executors#newCachedThreadPool

2 个答案:

答案 0 :(得分:5)

他们都更接近缓存的线程池。前两个参数是最重要的:并发运行的最小线程数和并发运行的最大线程数。如果Retrofit或OkHttp没有做任何工作,他们将不会消耗任何线程。如果他们运行1000个并发作业,他们将消耗1000个线程。

60秒是线程在不再需要之后的生命周期。这是缓存位:线程保持一分钟,这样如果有新作业进入,则不需要线程分配。

因此差异归结为SynchronousQueueLinkedBlockingQueue。我更喜欢LinkedBlockingQueue,因为排队线程不需要等待正在运行的线程启动。

答案 1 :(得分:0)

ThreadPoolExecutor只会在后备队列已满(1)时创建一个新线程。所以在OkHttp中,如果您在同一时间内多次发出多个请求,那么除了第一个请求之外的所有请求都会排队,因为corePoolSize被初始化为0。

对于客户端调用,请使用CachedThreadPool。

  1. &#34;如果有多个corePoolSize但运行的是最多的maximumPoolSize线程,则只有在队列已满时才会创建新线程。&#34; https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadPoolExecutor.html