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
?
答案 0 :(得分:5)
他们都更接近缓存的线程池。前两个参数是最重要的:并发运行的最小线程数和并发运行的最大线程数。如果Retrofit或OkHttp没有做任何工作,他们将不会消耗任何线程。如果他们运行1000个并发作业,他们将消耗1000个线程。
60秒是线程在不再需要之后的生命周期。这是缓存位:线程保持一分钟,这样如果有新作业进入,则不需要线程分配。
因此差异归结为SynchronousQueue
与LinkedBlockingQueue
。我更喜欢LinkedBlockingQueue
,因为排队线程不需要等待正在运行的线程启动。
答案 1 :(得分:0)
ThreadPoolExecutor只会在后备队列已满(1)时创建一个新线程。所以在OkHttp中,如果您在同一时间内多次发出多个请求,那么除了第一个请求之外的所有请求都会排队,因为corePoolSize被初始化为0。
对于客户端调用,请使用CachedThreadPool。