Android多线程编程之详解:阻塞队列+线程池( 三 )

  • 如果线程数超过了最大线程数,则执行饱和策略 。
  • 3.四种常用的线程池
    3.1.FixedThreadPool:他是可重用固定线程数的线程池,他的主要特点如下:
    • 只有核心线程,没有非核心线程,并且数量是固定的,keepAliveTime设置为0意味着多余的线程会被立即终止,因此不会产生多余的线程,采用了无界阻塞队列LinkedBlockingQueue 。
    • 当执行execute方法时:如果当前运行的线程数未达到核心线程数,则创建一个新线程来处理任务,如果运行线程数等于核心线程数,则将任务添加到阻塞队列中,FixThread就是拥有固定数量核心线程的线程池,并且这些核心线程不会被回收,当线程池中有空闲线程就会去任务队列取任务

    Android多线程编程之详解:阻塞队列+线程池

    文章插图
     
    4.CacheThreadPool
    4.1.CacheThreadPool:他是一个根据需要创建线程的线程池,他的主要特点如下:
    • CacheThreadPool的corePoolSize为0,maximumPoolSize设置为最大值,他没有核心线程,非核心线程是无界的,keepAliveTime设置为60s,并使用了阻塞队列SynchronousQueue,他是一个不存储元素的阻塞队列,每个插入操作必须要等待另外一个线程的移除操作,同样一个移除操作也需要等待插入操作 。

    Android多线程编程之详解:阻塞队列+线程池

    文章插图
     
    • 当执行execute方法时:首先会执行synchroniusQueue的offer方法来提交任务,并且查询线程池中是否有空闲的线程执行SynchronousQueue的poll方法来移除任务,如果有则配对成功,将任务交给这个线程去处理,如果没有则配对失败,创建新的线程去执行任务当线程池中的线程空闲时,他会执行SynchronusQueue的poll方法,等待synchronoudQueue提交的新任务,如果60s没有新任务提交到synchronousQueue,则这个线程就会终止 。cacheThreadPool适合大量需要立即处理并且耗时少的任务 。
    • SingleThreadExecutor:他是使用单个工作线程的线程池,corePoolSize和maximumPoolSize都为1,意味着SingleThreadExecutor只有一个核心线程,其他核心参数都和FixThreadPool一样,SingleThreadExecutor执行execute方法时,如果当前运行的线程数未达到核心线程数,也就是当前没有运行的线程,则创建一个新线程来处理任务,如果当前有运行的线程,则将任务添加到阻塞队列中,因此SingleThreadExecutor能确保所有的任务都在一个线程中按照顺序逐一执行

    Android多线程编程之详解:阻塞队列+线程池

    文章插图
     
    最后如果你看到了这里,觉得文章写得不错就给个赞呗!欢迎大家评论讨论!如果你觉得那里值得改进的,请给我留言 。一定会认真查询,修正不足,定期免费分享技术干货 。喜欢的小伙伴可以关注一下哦 。谢谢!




    推荐阅读