{{docContent.title}}

安卓进程池的使用

安卓中的进程池可以用Executors但是阿里编码规范说需要我手动的去创建进程池,所以我们只能用ThreadPoolExecutor来实现。

使用下面方法来初始化一个线程池。

public ThreadPoolExecutor(int corePoolSize,
                      int maximumPoolSize,
                      long keepAliveTime,
                      TimeUnit unit,
                      BlockingQueue<Runnable> workQueue,
                      ThreadFactory threadFactory,
                      RejectedExecutionHandler handler) {
    this.corePoolSize = corePoolSize;
    this.maximumPoolSize = maximumPoolSize;
    this.workQueue = workQueue;
    this.keepAliveTime = unit.toNanos(keepAliveTime);
    this.threadFactory = threadFactory;
    this.handler = handler;
}

你没看错,这个线程池有一堆麻烦的参数。下面有这些参数的详细解释。

corePoolSize: 线程池的核心线程数,默认情况下, 核心线程会在线程池中一直存活, 即使处于闲置状态. 但如果将allowCoreThreadTimeOut设置为true的话, 那么核心线程也会有超时机制, 在keepAliveTime设置的时间过后, 核心线程也会被终止.
maximumPoolSize: 最大的线程数, 包括核心线程, 也包括非核心线程, 在线程数达到这个值后,新来的任务将会被阻塞.
keepAliveTime: 超时的时间, 闲置的非核心线程超过这个时长,讲会被销毁回收, 当allowCoreThreadTimeOut为true时,这个值也作用于核心线程.
unit:超时时间的时间单位.
workQueue:线程池的任务队列, 通过execute方法提交的runnable对象会存储在这个队列中.
threadFactory: 线程工厂, 为线程池提供创建新线程的功能.
handler: 任务无法执行时,回调handler的rejectedExecution方法来通知调用者.

一个简单的线程池的管理类(要使用的话只需要自己new一个对象,然后调用就可以了)

/**
 * 线程池管理类
 * @author 小游
 */
public class ThreadPoolManager {
    private static ThreadPoolManager mInstance = new ThreadPoolManager();

    public static final synchronized ThreadPoolManager getInstance() {
        if (mInstance == null) {
            mInstance = new ThreadPoolManager();
        }
        return mInstance;
    }

    private ThreadPoolExecutor executor;

    public ThreadPoolManager() {
        int corePoolSize = Runtime.getRuntime().availableProcessors() * 2 + 1;
        /**
         * 存活时间
         */
        long keepAliveTime = 3;
        TimeUnit unit = TimeUnit.MINUTES;
        executor = new ThreadPoolExecutor(
                //线程池的核心线程数 ,默认情况下, 核心线程会在线程池中一直存活, 即使处于闲置状态. 但如果将allowCoreThreadTimeOut设置为true的话, 那么核心线程也会有超时机制。在keepAliveTime设置的时间过后, 核心线程也会被终止.
                corePoolSize,
                // 最大的线程数, 包括核心线程, 也包括非核心线程, 在线程数达到这个值后,新来的任务将会被阻塞.
                corePoolSize,
                //超时的时间, 闲置的非核心线程超过这个时长,讲会被销毁回收, 当allowCoreThreadTimeOut为true时,这个值也作用于核心线程.
                keepAliveTime,
                // 超时时间的时间单位.
                unit,
                //线程池的任务队列, 通过execute方法提交的runnable对象会存储在这个队列中.
                new LinkedBlockingQueue<Runnable>(),
                // 线程工厂, 为线程池提供创建新线程的功能.
                Executors.defaultThreadFactory(),
                // 任务无法执行时,回调handler的rejectedExecution方法来通知调用者
                new ThreadPoolExecutor.AbortPolicy()
        );
        executor.allowCoreThreadTimeOut(true);
        // keepAliveTime同样作用于核心线程
    }

    /**
     * 执行任务
     */
    public void execute(Runnable runnable) {
        if (runnable == null) {
            return;
        }
        executor.execute(runnable);
    }

    /**
     * 从线程池中移除任务
     */
    public void remove(Runnable runnable) {
        if (runnable == null) {
            return;
        }
        executor.remove(runnable);
    }
}