美文网首页
Android 下的线程池

Android 下的线程池

作者: sunjiandev | 来源:发表于2019-11-07 20:34 被阅读0次

Android 下的线程池

  • FixedThreadPool

是一种线程数量固定的线程池,当线程处于空闲状态时,不会被回收,除非线程池关闭了,当所有的线程处于活动状态时,新任务处于等待状态,直到有新的线程空闲出来,由于这个线程池只有核心线程,并且核心线程不会别回收,以为它可以快速响应外界的请求
无超时机制,无任务限制


        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(2);

        for (int i = 0; i < 20; i++) {

            fixedThreadPool.execute(new Runnable() {
                @Override
                public void run() {

                    try {
                        System.out.println(Thread.currentThread().getName() + " :开始执行");
                        Thread.sleep(5 * 1000);
                        System.out.println(Thread.currentThread().getName() + " :结束执行");

                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
        }
        
        执行结果
        
        pool-1-thread-1 :开始执行
        pool-1-thread-2 :开始执行
        pool-1-thread-2 :结束执行
        pool-1-thread-1 :结束执行
        pool-1-thread-2 :开始执行
        pool-1-thread-1 :开始执行
        pool-1-thread-1 :结束执行
        pool-1-thread-2 :结束执行
        pool-1-thread-2 :开始执行
        pool-1-thread-1 :开始执行

           ...
        
  • CachedThreadPool

线程数量不固定,只有非核心线程,且最大值为Integer.MAX_VALUE,当线程池中的线程都处于活动状态时,新任务绘开启新的线程处理,负责绘利用空闲的线程处理,线程池中空闲的线程都有超时机制,超时时间为60s,超时绘被自动回收
适合执行大量耗时较少的任务,当整个线程池都处于空闲状态时,线程池中的线程都会因超时而停止,不占系统资源

  • ScheduledThreadPool

核心线程数量是固定的,非核心线程数量是没有限制的,非核心线程空闲时绘被回收,
主要用于执行定时任务和固定周期的重复任务

  • SingleThreadPool

只有一个核心线程,确保所有的任务都在一个线程中顺序执行,所有的任务都在一个线程中,不需要处理线程同步的问题

线程名称|特点|适用场景|描述
---|:--:|:--:|:--:|---
FixedThreadPool|线程数量固定且只有核心线程,处于空闲状态也不会被回收|可以快速响应外界请求|FixThreadPool其实就像一堆人排队上公厕一样,可以无数多人排队,但是厕所位置就那么多,而且没人上时,厕所也不会被拆迁
CachedThreadPool|线程数量不固定,可以理解为无限,有新新任务就开启线程,超时60s,超时自动回收|适合执行大量耗时较少的任务|CachedThreadPool就像是一堆人去一个很大的咖啡馆喝咖啡,里面服务员也很多,随时去,随时都可以喝到咖啡。但是为了响应国家的“光盘行动”,一个人喝剩下的咖啡会被保留60秒,供新来的客人使用,哈哈哈哈哈,好恶心啊。如果你运气好,没有剩下的咖啡,你会得到一杯新咖啡。但是以前客人剩下的咖啡超过60秒,就变质了,会被服务员回收掉。
ScheduledThreadPool|核心线程数量固定,非核心线程数量没有限制,空闲时会被回收|用于执行定时任务或周期新重复的任务|就像华为公司,里面有若干核心员工,有若干外包公司的员工,在任务忙的时候,核心人员先忙,忙不过来,外包员工上,如果活干完了,外包员工就
SingleThreadPool|只有一个核心线程,所有的任务都在一个线程中执行,不需要处理线程同步的问题|适合执行不需要线程同步的任务|可以把SingleThreadPool简单的理解为FixThreadPool的参数被手动设置为1的情况,即Executors.newFixThreadPool(1).execute(r)。所以SingleThreadPool可以理解为公厕里只有一个坑位,先来先上,后来排队

线程池工具类:


/**
 * 线程池代理类
 * @author sun
 */
public class ThreadPoolProxy {

    private static final String TAG =  ThreadPoolProxy.class.getCanonicalName();
    private static Serializable serializable;
    private ThreadPoolExecutor mThreadPoolExecutor;
    private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
    private static final int CORE_POOL_SIZE = Math.max(2, Math.min(CPU_COUNT - 1, 4));
    private static final int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1;
    private static final int KEEP_ALIVE_SECONDS = 30;

    private static ThreadPoolProxy threadPoolProxy;

    private ThreadPoolProxy() {
    }

    public static ThreadPoolProxy getInstance(Serializable serializable) {
        ThreadPoolProxy.serializable = serializable;
        if (threadPoolProxy == null) {
            synchronized (ThreadPoolProxy.class) {
                if (threadPoolProxy == null) {
                    threadPoolProxy = new ThreadPoolProxy();
                }
            }
        }

        return threadPoolProxy;

    }

    private ThreadPoolExecutor initExecutor() {
        if (mThreadPoolExecutor == null) {
            synchronized (ThreadPoolProxy.class) {
                if (mThreadPoolExecutor == null) {

                    TimeUnit unit = TimeUnit.MILLISECONDS;
                    ThreadFactory threadFactory = Executors.defaultThreadFactory();
                    RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy();
                    LinkedBlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>();

                    mThreadPoolExecutor = new ThreadPoolExecutor(
                            //核心线程数
                            CORE_POOL_SIZE,
                            //最大线程数
                            MAXIMUM_POOL_SIZE,
                            //保持时间
                            KEEP_ALIVE_SECONDS,
                            //保持时间对应的单位
                            unit,
                            workQueue,
                            //线程工厂
                            threadFactory,
                            //异常捕获器
                            handler);
                }
            }
        }
        MyLog.d(TAG,"CORE_POOL_SIZE : " + CORE_POOL_SIZE + "  MAXIMUM_POOL_SIZE:   " + MAXIMUM_POOL_SIZE + "   KEEP_ALIVE_SECONDS:  " + KEEP_ALIVE_SECONDS);
        return mThreadPoolExecutor;
    }


    /**
     * 执行任务
     */
    public void executeTask(Runnable r) {
        initExecutor();
        mThreadPoolExecutor.execute(r);
    }


    /**
     * 提交任务
     */
    public Future<?> commitTask(Runnable r) {
        initExecutor();
        return mThreadPoolExecutor.submit(r);
    }

    /**
     * 删除任务
     */
    public void removeTask(Runnable r) {
        initExecutor();
        mThreadPoolExecutor.remove(r);
    }
    public Serializable getSerializable(){
        return serializable;
    }

}


...

定时器工具类

public class TimerUtils {

    private static volatile TimerUtils mInstance;
    private final ScheduledThreadPoolExecutor executor;

    private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();

    private static final int CORE_POOL_SIZE = Math.max(2, Math.min(CPU_COUNT - 1, 4));

    private TimerUtils() {

        BasicThreadFactory threadFactory = new BasicThreadFactory.Builder().namingPattern("TimerUtils").daemon(true).build();
        executor = new ScheduledThreadPoolExecutor(CORE_POOL_SIZE, threadFactory);
    }

    public static TimerUtils getInstance() {
        if (mInstance == null) {
            synchronized (TimerUtils.class) {
                if (mInstance == null) {
                    mInstance = new TimerUtils();
                }
            }
        }
        return mInstance;
    }

    /**
     * 执行定时器
     *
     * @param runnable     线程
     * @param initialDelay 延迟执行时间
     * @param period       执行的时间间隔
     */
    public void startTimer(Runnable runnable, long initialDelay, long period) {
        executor.scheduleAtFixedRate(runnable, initialDelay, period, TimeUnit.MILLISECONDS);
    }

    /**
     * 取消定时器
     */
    public void cancel() {
        executor.shutdown();
    }

    /**
     * 开启一个线程
     *
     * @param runnable 线程
     */
    public void execute(Runnable runnable) {
        executor.execute(runnable);
    }

    public void remove(Runnable runnable) {

        BlockingQueue<Runnable> queue = executor.getQueue();

            int i = runnable.hashCode();
            System.out.println("i = " + i);

        for (Runnable runnable1 : queue) {
            System.out.println("runnable1 = " + runnable1.hashCode());
        }
    }

    /**
     * 延时执行一个线程
     *
     * @param runnable 线程
     * @param delay    延时时间
     */
    public void schedule(Runnable runnable, long delay) {
        executor.schedule(runnable, delay, TimeUnit.MILLISECONDS);
    }
}

//需要添加依赖
 implementation 'org.apache.commons:commons-lang3:3.0'

相关文章

  • Android 下的线程池

    Android 下的线程池 FixedThreadPool 是一种线程数量固定的线程池,当线程处于空闲状态时,不会...

  • 线程池创建和相关知识

    线程池创建(单例):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,它...

  • 19. 线程池

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

  • Android多线程规划

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

网友评论

      本文标题:Android 下的线程池

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