美文网首页
Android 线程池

Android 线程池

作者: 沐络 | 来源:发表于2019-07-18 11:07 被阅读0次

线程池概念

源于Java的Executor接口,通过ThreadPoolExceutor进行实现,而ThreadPoolExecutor继承于AbstractExecutorService,AbstractExecutorService 是ExecutorService的实现,ExecutorService继承了Executor接口.

线程池的优点

1,重用线程池中的线程,避免的频繁创建和销毁线程所带来的内存开销

2,有效的控制最大的并发数,避免线程之前因抢占资源而阻塞

3,简单管理线程,提供定时执行及指定时间间隔循环执行

常用构造方法参数

public ThreadPoolExecutor(int corePoolSize,    

                                            int maximumPoolSize,

                                            long keepAliveTime,

                                            TimeUnit unit,

                                            BlockingQueue<Runnable> workQueue,

                                            ThreadFactory threadFactory){}

corePoolSize,核心线程数(默认情况下一直存活于线程池,即使处于闲置),如果ThreadPoolExecutor中allowCoreThreadTimeOut

为true,则核心线程在等待新任务是有超时终止策略,超时时间由keepAliveTime决定

maximumPoolSize 最大线程数,当线程数超过这个值,则新任务将被阻塞

keepAliveTime 非核心线程超时时长,超过这个时间讲被回收,当核心线程设置了AllowCoreThreadTimeOut为true时,keepAliveTime同样适用于核心线程

unit,指定KeepAliveTime参数的时间单位

workQueue,线程池中任务队列,存储新提交的Runnable对象

threadFactory,线程工厂,为线程池创建新线程

handler,不常用参数,类型为RejectedExecutionHandler,当线程池无法执行新任务时间,会调用Handler抛出异常

执行规则

1)线程池中数量未达到核心线程数,则直接启动核心线程

2)线程池中线程数超过核心线程数量,则被插入到任务队列中排队等待执行

3)第二步中无法插入新任务,说明队列已满,如未达到规定最大线程数量,则启动非核心线程执行

4)如果线程数量超过最大值,则拒绝任务并通用RejectedExecutionHandler通知调用者

线程池主要分为四类

1,FixedThreadPool

特点

1)线程数量固定且都是核心线程,核心线程数量和最大线程数量都是nThreads

2)核心线程不会被回收,快速响应外界请求

3)没有超时机制,任务队列没有大小限制

4)新任务使用核心线程处理,没有空闲核心线程,则排队等待执行

public static ExecutorService newFixedThreadPool(int nThreads){

        return new ThreadPoolExecutor(nThreads,nThreads,

                                                            0L,TimeUnit.MILLISECONDS,

                                                            new LinkedBlockingQueue<Runnable>());

}

2,CachedThreadPool

特点

1)线程数量不定,只有非核心线程,最大线程数任意大,传入核心线程数量为0,最大线程数为Integer.MAX_VALUE;

2)新任务来时使用空闲线程执行,没有空闲线程则创建新线程处理

3)每个空闲线程都有超时机制,时长60s,空闲线程超过60时,则被回收

4)适合执行大量耗时较少的任务,

public static ExecutorService newCacheThreadPool(){

        return new ThreadPoolExecutor(0,Integer.MAX_VALUE,

                                                            60L,TimeUnit.SECONDS,

                                                             new SynchronusQueue<Runable>());

}

3,ScheduledThreadPool

特点

1)核心线程数量固定,非核心线程数量无限

2)非核心线程闲置10s会被回收

3)主要用户执行定时任务和具有固定周期的重复任务

4)唯一有延时执行和周期重复执行能力,主要用户处理任务队列延迟的工作

    public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {

        return new ScheduledThreadPoolExecutor(corePoolSize);

    }

    //默认闲置超时回收时常

    private static final long DEFAULT_KEEPALIVE_MILLIS = 10L;

    public ScheduledThreadPoolExecutor(int corePoolSize) {

        super(corePoolSize, Integer.MAX_VALUE,

              DEFAULT_KEEPALIVE_MILLIS, MILLISECONDS,

              new DelayedWorkQueue());

    }

4,SingleThreadExecutor(单线程池)

特点

1)只有一个核心线程,所有任务在同一个线程池中按顺序执行

2)所有外界任务统一道一个线程中,不需要处理同步

    public static ExecutorService newSingleThreadExecutor() {

        return new FinalizableDelegatedExecutorService

            (new ThreadPoolExecutor(1, 1,

                                    0L, TimeUnit.MILLISECONDS,

                                    new LinkedBlockingQueue<Runnable>()));

    }

相关文章

  • 线程池创建和相关知识

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

  • Android线程池的使用

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

  • 线程池

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

  • 笔记:Android线程和线程池

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

  • 第十九周 线程池

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

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

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

  • Android面试之线程和线程池

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

  • Android多线程规划

    Android上的线程池使用 Android线程 特性 Each thread costs a minimum o...

  • 19. 线程池

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

  • Android的线程和线程池

    Android的线程和线程池 标签(空格分隔): android 一些概念: 线程分类:主线程和子线程,主线程主要...

网友评论

      本文标题:Android 线程池

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