Android中的线程池

Posted endian11

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android中的线程池相关的知识,希望对你有一定的参考价值。

  • 线程池的优点:
    • 重用线程池中的线程,避免因为线程的创建和销毁所带来的性能开销
    • 能有效控制线程池的最大并发数,避免大量的线程池之间因互相抢占资源而导致的阻塞现象
    • 能够对线程进行简单的管理并提供定时执行以及指定间隔循环执行等功能

 

  • android中的线程池来源于Java的Execcutor(接口),真正的实现为ThreadPoolExecutor
    public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler) {
    }
    
    • corePoolSize:核心线程数,会在线程池中一直存活,即时处于闲置状态;但如果将ThreadPoolExecutor的allowCoreThreadTimeOut设置为true,那么闲下来的核心线程就有超时策略,由keepAliveTime决定,时长到后,核心线程会终止运行
    • maximumPoolSize:最大线程数
    • keepAliveTime:非核心线程闲置时的超时时长
      如果将ThreadPoolExecutor的allowCoreThreadTimeOut设置为true,那么闲下来的核心线程就有超时策略,由keepAliveTime决定,
    • unit:时间单位,是一个枚举
    • workQueue:线程池的任务队列,通过execute方法提交的Runnable对象会存储在这个参数中
    • threadFactory:线程工厂,为线程池提供创建新线程的功能;ThreadFactory是个接口,只有一个 Thread newThread(Runnable r)
    • handler:这个参数不常用,当线程池无法执行新任务时,会跑出异常

 

  • ThreadPoolExecutor执行时大致遵循规则:
    • 如果线程池的核心线程数未达到,那么会启动一个核心线程来执行任务
    • 如果达到或超过核心线程数,任务会被插入到任务队列排队
    • 如果任务无法插入到任务队列,这往往是由于任务队列已满,这个时候如果线程数量未达到最大线程数,那么会启动一个非核心线程来执行任务
    • 如果已经达到最大线程数,那么就拒绝执行此任务,ThreadPoolExecutor会调用RejectExecutionHandler的rejectExecution方法来通知调用者

 

  • 线程池的分类
    • newFixedThreadPool;线程数量固定的线程池,没有超时,不会被关闭核心线程(只有核心线程),除非线程池被关闭了;任务队列没有限制

    • newCachedThreadPool():没有核心线程只有非核心线程,没有任务队列,有60s超时机制,查过60s闲置线程就会被回收,适合执行大量的耗时比较少的任务。所有线程超时终止,是不占用任何资源的

    • newSingleThreadPoolExecutor  只有一个核心线程不需要处理线程同步的问题
      • public static ExecutorService newSingleThreadExecutor() {
            return new FinalizableDelegatedExecutorService
                (new ThreadPoolExecutor(1, 1,
                                        0L, TimeUnit.MILLISECONDS,
                                        new LinkedBlockingQueue<Runnable>()));
        }
        
    • newScheduledThreadPool:固定核心线程,非核心线程Integer.MAX_VALUE,执行定时任务和具有固定重复周期的重复任务
      •    public ScheduledThreadPoolExecutor(int corePoolSize) {
                super(corePoolSize, Integer.MAX_VALUE,
                      DEFAULT_KEEPALIVE_MILLIS, MILLISECONDS,
                      new DelayedWorkQueue());
            }
        

          

        public <V> ScheduledFuture<V> schedule(Callable<V> callable,
        long delay,
        TimeUnit unit) {

以上是关于Android中的线程池的主要内容,如果未能解决你的问题,请参考以下文章

Android中的线程池

android线程与线程池-----线程池《android开发艺术与探索》

Android中的线程池

Android(java)学习笔记267:Android线程池

如何终止 android线程池中的任务

Android进阶知识——Android线程和线程池