2

OkHttp 2.0.0-RC1 使用DispatcherThreadPoolExecutor中定义:#getExecutorService

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

这本质上是Executors#newFixedThreadPool.

另一方面,平台Executors.newCachedThreadPool中定义的改造用途归结为:#defaultHttpExecutor

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

任何人都知道为什么 OkHttp 使用Executors#newFixedThreadPool和 Retrofit Executors#newCachedThreadPool

4

2 回答 2

6

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

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

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

于 2014-05-28T03:03:02.150 回答
0

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

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

  1. “如果运行的线程数多于 corePoolSize 但少于 maximumPoolSize,则仅当队列已满时才会创建新线程。” https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadPoolExecutor.html
于 2015-06-02T22:22:55.040 回答