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秒是线程不再需要生存的时间。这是缓存位:线程保留一分钟,这样,如果有新作业进入,则无需分配线程。
因此,差异归结为SynchronousQueue
与LinkedBlockingQueue
。我更喜欢LinkedBlockingQueue
,因为排队线程不需要等待正在运行的线程启动。