Okhttp原理之线程池

2021-07-02  本文已影响0人  馒Care

线程的概念

线程的特点

线程的属性

进程和线程都是一个时间段的描述,是 CPU 工作时间段的描述,只是颗粒不同罢了。

线程池的概念

线程池的优点

1.降低内存消耗:通过复用线程,降低线程的创建以及销毁带来的损耗
2.提高响应速度:当任务到达,无需等待线程创建可以立即执行,跟第一点类似
3.提高管理型:由于线程占用系统资源,如果无限制的创建,不仅会消耗系统的资源,还会降低系统的稳定性,使用线程池可以进行统一的管理,如资源的分配、性能优化等。

线程池的源码分析

/**
     * Creates a new {@code ThreadPoolExecutor} with the given initial
     * parameters and default thread factory.
     *
     * @param corePoolSize the number of threads to keep in the pool, even
     *        if they are idle, unless {@code allowCoreThreadTimeOut} is set
     * @param maximumPoolSize the maximum number of threads to allow in the
     *        pool
     * @param keepAliveTime when the number of threads is greater than
     *        the core, this is the maximum time that excess idle threads
     *        will wait for new tasks before terminating.
     * @param unit the time unit for the {@code keepAliveTime} argument
     * @param workQueue the queue to use for holding tasks before they are
     *        executed.  This queue will hold only the {@code Runnable}
     *        tasks submitted by the {@code execute} method.
     * @param handler the handler to use when execution is blocked
     *        because the thread bounds and queue capacities are reached
     * @throws IllegalArgumentException if one of the following holds:<br>
     *         {@code corePoolSize < 0}<br>
     *         {@code keepAliveTime < 0}<br>
     *         {@code maximumPoolSize <= 0}<br>
     *         {@code maximumPoolSize < corePoolSize}
     * @throws NullPointerException if {@code workQueue}
     *         or {@code handler} is null
     */
public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue,
                          ThreadFactory threadFactory,
                          RejectedExecutionHandler handler)

1.int corePoolSize(核心线程数):线程池创建线程的时候,核心线程数将被保留在线程池中,即便当前核心线程数处于(闲置状态),除非设置了allowCoreThreadTimeOut为true,那么如果核心线程数处于(闲置状态),在超过一定时间(keepAliveTime),就会被销毁掉。

2.int maximumPoolSize(线程池最大容量):线程池最大容量=核心线程数+非核心线程数

3.long keepAliveTime (通指非核心线程闲置存活时间):非核心线程空闲时长超过一定时长keepAliveTime,将会被回收

4.TimeUnit unit(keepAliveTime的时间单位)

5.BlockingQueue<Runnable> workQueue(任务队列)

ThreadPoolExecutor.executor()

 if (workerCountOf(c) < corePoolSize) {
            if (addWorker(command, true))
                return;
            c = ctl.get();
        }
        if (isRunning(c) && workQueue.offer(command)) {
            int recheck = ctl.get();
            if (! isRunning(recheck) && remove(command))
                reject(command);
            else if (workerCountOf(recheck) == 0)
                addWorker(null, false);
        }
        else if (!addWorker(command, false))
            reject(command);
ThreadPoolExecutor.addWorker()

else if (!addWorker(command, false))
else if (!addWorker(command, false))
            reject(command);

6.ThreadFactory threadFactory (创建线程的工厂模式)

使用默认即可
Executors.defaultThreadFactory()

7.RejectedExecutionHandler handler(拒绝策略):执行被阻止时要使用的处理程序,因为达到线程边界和队列容量

8.拒绝策略的4种模式

9.图解线程池工作模式


线程池工作模式

10.常见线程池


常见线程池

11 常用的workQueue任务队列

线程跟线程池的关系

合理配置线程池

1.cpu密集型:线程池中线程个数尽量少,常规配置(CPU核心数+1)
2.io密集型:有io操作速度比cpu速度慢,所以运行这种类型的任务时,cpu处于空闲状态,那么线程池可以多分配线程数量,以此提高cpu利用率,常规配置(2*CPU核心数+1)
3.乱七八糟任务:视情况进行拆解

Okhttp线程池的使用

@get:JvmName("executorService") val executorService: ExecutorService
    get() {
      if (executorServiceOrNull == null) {
        executorServiceOrNull = ThreadPoolExecutor(0, Int.MAX_VALUE, 60, TimeUnit.SECONDS,
            SynchronousQueue(), threadFactory("$okHttpName Dispatcher", false))
      }
      return executorServiceOrNull!!
    }

根据源码可知,Okhttp使用SynchronousQueue,对标上文,当前线程池没有核心线程,同步队列,先来先执行,线程空闲后,不会保留,并且适用于短时间的任务操作。

上一篇下一篇

猜你喜欢

热点阅读