浅谈Android线程池封装
2015-12-29 19:41
459 查看
Android项目当中经常会出现很多很多的我们需要使用子线程的情况,需要我们异步的加载数据或者实现UI视图和数据的绑定,但是我们又想减少资源的消耗,这个时候我们就需要引入线程池,而且我们的线程池尽量保证为单例
封装线程池ThreadPoolExecutor创建ThreadPoolProxy中间代理类,实现构造方法
int mCorePoolSize;
int mMaximumPoolSize;
long mKeepAliveTime;
ThreadPoolExecutor mThreadPoolExecutor;//只需要初始化一次
public ThreadPoolProxy(int corePoolSize, int maximumPoolSize, long keepAliveTime) {
mCorePoolSize = corePoolSize;
mMaximumPoolSize = maximumPoolSize;
mKeepAliveTime = keepAliveTime;
}封装ThreadPoolExecutor,将必要参数从外界传入
private void initThreadPoolExecutor() {
if (mThreadPoolExecutor == null || mThreadPoolExecutor.isShutdown() || mThreadPoolExecutor.isTerminated()) {
synchronized (ThreadPoolProxy.class) {
if (mThreadPoolExecutor == null || mThreadPoolExecutor.isShutdown() || mThreadPoolExecutor
.isTerminated()) {
TimeUnit unit = TimeUnit.MILLISECONDS;
BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue();
ThreadFactory threadFactory = Executors.defaultThreadFactory();
RejectedExecutionHandler handler = new ThreadPoolExecutor.DiscardPolicy();
mThreadPoolExecutor = new ThreadPoolExecutor(
mCorePoolSize, //核心池的大小
mMaximumPoolSize, //最大线程数
mKeepAliveTime,//保持时间
unit,//保持时间的单位
workQueue,//工作队列
threadFactory,//线程工厂
handler//异常捕获器
);
}
}
}
}实现ThreadPoolExecutor必要方法
/**
* 提交任务
*/
public Future<?> submit(Runnable task) {
initThreadPoolExecutor();
Future<?> submitResult = mThreadPoolExecutor.submit(task);
return submitResult;
}
/**
* 执行任务
*/
public void execute(Runnable task) {
initThreadPoolExecutor();
mThreadPoolExecutor.execute(task);
}
/**
* 移除任务
*/
public void remove(Runnable task) {
initThreadPoolExecutor();
mThreadPoolExecutor.remove(task);
}创建线程池工厂类,封装针对不同情况所有使用的线程池
/**
* 返回普通线程池的代理
* 双重检查加锁,保证只有第一次实例化的时候才启用同步机制,提高效率
* @return
*/
public static ThreadPoolProxy createNormalThreadPoolProxy() {
if (mNormalThreadPoolProxy == null) {
synchronized (ThreadPoolProxyFactory.class) {
if (mNormalThreadPoolProxy == null) {
mNormalThreadPoolProxy = new ThreadPoolProxy(5, 5, 3000);
}
}
}
return mNormalThreadPoolProxy;
}
/**
* 返回下载线程池的代理
*/
public static ThreadPoolProxy createDownloadThreadPoolProxy() {
if (mDownloadThreadPoolProxy == null) {
synchronized (ThreadPoolProxyFactory.class) {
if (mDownloadThreadPoolProxy == null) {
mDownloadThreadPoolProxy = new ThreadPoolProxy(3, 3, 3000);
}
}
}
return mDownloadThreadPoolProxy;
}这样一个线程池的工厂类就实现了,我们可以根据实际情况对于线程池代理类进行不同的封装,满足我们的需求!
封装线程池ThreadPoolExecutor创建ThreadPoolProxy中间代理类,实现构造方法
int mCorePoolSize;
int mMaximumPoolSize;
long mKeepAliveTime;
ThreadPoolExecutor mThreadPoolExecutor;//只需要初始化一次
public ThreadPoolProxy(int corePoolSize, int maximumPoolSize, long keepAliveTime) {
mCorePoolSize = corePoolSize;
mMaximumPoolSize = maximumPoolSize;
mKeepAliveTime = keepAliveTime;
}封装ThreadPoolExecutor,将必要参数从外界传入
private void initThreadPoolExecutor() {
if (mThreadPoolExecutor == null || mThreadPoolExecutor.isShutdown() || mThreadPoolExecutor.isTerminated()) {
synchronized (ThreadPoolProxy.class) {
if (mThreadPoolExecutor == null || mThreadPoolExecutor.isShutdown() || mThreadPoolExecutor
.isTerminated()) {
TimeUnit unit = TimeUnit.MILLISECONDS;
BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue();
ThreadFactory threadFactory = Executors.defaultThreadFactory();
RejectedExecutionHandler handler = new ThreadPoolExecutor.DiscardPolicy();
mThreadPoolExecutor = new ThreadPoolExecutor(
mCorePoolSize, //核心池的大小
mMaximumPoolSize, //最大线程数
mKeepAliveTime,//保持时间
unit,//保持时间的单位
workQueue,//工作队列
threadFactory,//线程工厂
handler//异常捕获器
);
}
}
}
}实现ThreadPoolExecutor必要方法
/**
* 提交任务
*/
public Future<?> submit(Runnable task) {
initThreadPoolExecutor();
Future<?> submitResult = mThreadPoolExecutor.submit(task);
return submitResult;
}
/**
* 执行任务
*/
public void execute(Runnable task) {
initThreadPoolExecutor();
mThreadPoolExecutor.execute(task);
}
/**
* 移除任务
*/
public void remove(Runnable task) {
initThreadPoolExecutor();
mThreadPoolExecutor.remove(task);
}创建线程池工厂类,封装针对不同情况所有使用的线程池
/**
* 返回普通线程池的代理
* 双重检查加锁,保证只有第一次实例化的时候才启用同步机制,提高效率
* @return
*/
public static ThreadPoolProxy createNormalThreadPoolProxy() {
if (mNormalThreadPoolProxy == null) {
synchronized (ThreadPoolProxyFactory.class) {
if (mNormalThreadPoolProxy == null) {
mNormalThreadPoolProxy = new ThreadPoolProxy(5, 5, 3000);
}
}
}
return mNormalThreadPoolProxy;
}
/**
* 返回下载线程池的代理
*/
public static ThreadPoolProxy createDownloadThreadPoolProxy() {
if (mDownloadThreadPoolProxy == null) {
synchronized (ThreadPoolProxyFactory.class) {
if (mDownloadThreadPoolProxy == null) {
mDownloadThreadPoolProxy = new ThreadPoolProxy(3, 3, 3000);
}
}
}
return mDownloadThreadPoolProxy;
}这样一个线程池的工厂类就实现了,我们可以根据实际情况对于线程池代理类进行不同的封装,满足我们的需求!
相关文章推荐
- 学习Android从0开始之背景篇-Android系统介绍
- Android中TextView内容过长加省略号
- android基础学习之activity(二)
- Android技巧随笔记录
- android基础学习之activity(一)
- (十四)android项目gif实现调研总结
- xml布局中实现文字下划线的效果
- Android ViewPager切换动画
- android自定义ListView高度设置无效
- android 资源文字ids的作用
- android 资源文字ids的作用
- android 资源文字ids的作用
- android URL 空格
- Android绘图(二)
- 19.Android之文件存储方法学习
- AndroidStudio开发环境搭建
- Android 之 注解
- Android自定义组合控件
- android适配的努力
- [android问题]小记碰到的问题