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和Retrofit Executors#newCachedThreadPool吗?

最佳答案

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

60秒是线程不再需要生存的时间。这是缓存位:线程保留一分钟,这样,如果有新作业进入,则无需分配线程。

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

10-04 15:06