美文网首页我爱编程
Android 中的线程池

Android 中的线程池

作者: QuincySx | 来源:发表于2018-05-26 20:24 被阅读44次

为什么使用线程池?

1、重用线程,防止频繁的创建销毁线程所带来的时间和资源等性能损耗。
2、有效的控制最大线程并发数,防止大量线程抢夺系统资源引起卡顿,合理利用系统资源。
3、对线程进行简单管理、以及线程间更好的协作工作

Android 中有哪几种线程池?

实际意义上我们所说的几种常用线程池都是 Java 封装好,都在 Executors 这个工厂类里面了,笔者使用的是 JDK8 所以发现里面有六种线程池,接下来分别介绍下

1. FixedThreadPool

数量固定的核心线程池,当线程池处于空闲时线程也不会被回收,除非线程被关闭了。如果所有线程都在运行中,再有新任务添加时新任务会处于等在状态,知道有线程空闲在运行。处于等待的任务没有数量上限

2. CachedThreadPool

这是一种线程数量不定的线程池,他只有非核心线程,线程池如果没有空闲线程,会随时创建新的线程来工作,如果空下来的线程空闲时长超过 60 秒,则会被回收。他在长时间不工作的时候内部是没有任何线程的,也就是不消耗任何资源

3. SingleThreadExecutor

只有一个核心线程的线程池,所有任务都要排队等待由唯一的一个核心线程来处理,处于等待的任务队列个数没有上限

4. ScheduledThreadPool

这是一个核心线程数量固定,非核心线程没有上限的线程池,非核心线程闲置时间超过 10 秒就会被回收(不同版本 JDK 可能不同),并且他的等待队列只有 16 个。并且支持定时及周期性任务执行。

5. SingleThreadScheduledExecutor

就是一个只有一个核心线程的 ScheduledThreadPool 线程池

6. WorkStealingPool

创建持有足够线程的线程池来支持给定的并行级别,并通过使用多个队列,减少竞争,它需要传一个并行数量,如果不传,则被设定为默认的CPU数量

自定义线程池

接下来上面提到的核心线程、非核心线程是什么,还有上面线程池的实现。
上面所有的线程池都是通过以下两个类创建的

一、 先说一说 ThreadPoolExecutor

public ThreadPoolExecutor(
    int corePoolSize,
    int maximumPoolSize,
    long keepAliveTime,
    TimeUnit unit,
    BlockingQueue<Runnable> workQueue) {
         this(corePoolSize, 
             maximumPoolSize, 
             keepAliveTime, 
             unit, 
             workQueue,
             Executors.defaultThreadFactory(), 
             defaultHandler);
}

看一看各项参数

  • corePoolSize:线程池的核心线程数
  • maximumPoolSize:线程池中允许的最大线程数(maximumPoolSize-corePoolSize = 非核心线程)
  • keepAliveTime:空闲线程结束的超时时间(如果 allowCoreThreadTimeOut 属性设置为 true 核心线程闲置 keepAliveTime 时间以上也会被回收,false 则不会回收)
  • unit:是一个枚举,它表示的是 keepAliveTime 的单位
  • workQueue:工作队列,用于任务的存放

运行流程

  1. 线程池创建的时候里面不会有任何线程
  2. 如果正在运行的线程数量小于 corePoolSize,那么马上创建线程运行这个任务;
  3. 如果正在运行的线程数量大于或等于 corePoolSize,那么将这个任务放入队列;
  4. 如果这时候队列满了,而且正在运行的线程数量小于 maximumPoolSize,那么还是要创建非核心线程立刻运行这个任务;
  5. 如果队列满了,而且正在运行的线程数量大于或等于 maximumPoolSize,那么线程池会抛出异常RejectExecutionException。

我们上面说的 FixedThreadPool、CachedThreadPool、SingleThreadExecutor、ScheduledThreadPool、SingleThreadScheduledExecutor 都是通过 ThreadPoolExecutor 创建的,好奇的人可以看一下源码。

二、 ForkJoinPool

ForkJoinPool 是JDK 7加入的一个线程池类。Fork/Join 技术是分治算法(Divide-and-Conquer)的并行实现,它是一项可以获得良好的并行性能的简单且高效的设计技术。目的是为了帮助我们更好地利用多处理器带来的好处,使用所有可用的运算能力来提升应用的性能。我们常用的数组工具类 Arrays 在JDK 8之后新增的并行排序方法(parallelSort)就运用了 ForkJoinPool 的特性,还有 ConcurrentHashMap 在JDK 8之后添加的函数式方法(如forEach等)也有运用。

我们上面说的 WorkStealingPool 都是通过 ForkJoinPool 创建的。

这个知识点比较复杂大家可以参考其他博客

相关文章

  • Android线程池的使用

    一、线程与线程池,为什么要使用线程池 1、Android中的线程 在Android中有主线程和子线程的区分。主线程...

  • Android 多线程:线程池理解和使用总结

    一、Android线程池介绍 1.1 原理 Android中的线程池概念来源于Java中的Executor,Exe...

  • 19. 线程池

    Android 中的线程池就是 java 中的线程池,即 ThreadPoolExecutor 类。 Java 通...

  • 线程池

    话题:线程池Android中的线程池有哪些?它们的区别是什么?为什么要使用线程池? 线程是Android里面一个很...

  • Android 多线程

    AsyncTaskHandlerThreadIntentServiceandroid中的线程池 android 中...

  • 笔记:Android线程和线程池

    Android线程和线程池 Android中的线程操作相关的类有 AsyncTask IntentService ...

  • Android面试之线程和线程池

    Android中的线程形态 AsyncTask底层用到了线程池。AsyncTask封装了线程池和Handler,它...

  • 第十九周 线程池

    话题:线程池 Android 中的线程池有哪些?它们的区别是什么?为什么要使用线程池?关键字:线程池、Thread...

  • 线程池创建和相关知识

    线程池创建(单例):Android线程池得要这么用 - 简书 线程池相关知识:Android开发之线程池使用总结 ...

  • Android中的线程池

    为什么要使用线程池?Android 中的线程池有哪些?它们的区别是什么? 一、线程池的作用 重用线程池中的线程,可...

网友评论

    本文标题:Android 中的线程池

    本文链接:https://www.haomeiwen.com/subject/czhmjftx.html