- public synchronized ExecutorService executorService() {
- if (executorService == null) {
- executorService = , Integer.MAX_VALUE, , TimeUnit.SECONDS,
- new SynchronousQueue(), Util.threadFactory(“OkHttp Dispatcher”, false));
- }
- return executorService;
- }
1.2 Call对象
了解源码或使用过okhttp
的都知道。 okttp
的操作元是Call对象。异步的实现是RealCall.AsyncCall
。而 AsyncCall
是实现的一个Runnable
接口。
- final class AsyncCall extends NamedRunnable {}
所以Call本质就是一个Runable
线程操作元肯定是放进excutorService中直接启动的。
2 线程池的复用和管理
2.1 图解
为了完成调度和复用,定义了两个队列分别用作等待队列和执行任务的队列。这两个队列都是Dispatcher
成员变量。Dispatcher是一个控制执行,控制所有Call的分发和任务的调度、通信、清理等操作。这里只介绍异步调度任务。
-
/** Ready async calls in the order they’ll be run. */
-
private final Deque readyAsyncCalls = new ArrayD