安卓中的进程池可以用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);
}
}