线程池可以使线程得到复用
/**
* 描述 ThreadPool的代理
* 描述 1.替原对象进行一些操作-->完成初始化操作
* 描述 2.对原对象某些方法进行增强-->不用关心线程池的初始化操作
* 描述 3.只需要暴露使用线程池的时候真正关心的东西即可(执行任务,提交任务,移除任务)
* <p/>
* 更新者 $Author$
* 更新时间 $Date$
* 更新描述 ${TODO}
*/
public class ThreadPoolProxy {
ThreadPoolExecutor mExecutor;
private int mCorePoolSize;
private int mMaximumPoolSize;
/**
* @param corePoolSize 核心池大小
* @param maximumPoolSize 最大线程数,最大线程数和核心池大小保持一致
*/
public ThreadPoolProxy(int corePoolSize, int maximumPoolSize) {
mCorePoolSize = corePoolSize;
mMaximumPoolSize = maximumPoolSize;
}
private void initThreadPoolExecutor() {
if(mExecutor==null || mExecutor.isShutdown() || mExecutor.isTerminated()){
synchronized (ThreadPoolProxy.class){
if(mExecutor==null || mExecutor.isShutdown() || mExecutor.isTerminated()){
//初始化mExecutor
long keepAliveTime = 3000;//保持时间
TimeUnit unit = TimeUnit.MILLISECONDS;//保持时间的单位
ThreadFactory threadFactory = Executors.defaultThreadFactory();//线程工厂
BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>();//任务队列(无界对象)
RejectedExecutionHandler handler = new ThreadPoolExecutor.DiscardPolicy();//异常捕获器
mExecutor = new ThreadPoolExecutor(mCorePoolSize, mMaximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler);
}
}
}
}
/*
执行任务和提交任务的区别?
是否有返回值
submit-->有
execute-->没有
Future有什么作用,有返回值可以有什么特别的一些效果?
检测(得知)任务是否执行完成
等待任务完成
接收任务执行完成之后的结果
其中有一个get-->阻塞的方法,可以接收结果,try catch到任务执行过程中抛出的异常
其中有一个cancel-->取消执行的操作
*/
/**
* 执行任务
* @param task
*/
public void execute(Runnable task){
initThreadPoolExecutor();
mExecutor.execute(task);
}
/**
* 提交任务
* @param task
*/
public Future<?> submit(Runnable task){
initThreadPoolExecutor();
Future<?> submit = mExecutor.submit(task);
return submit;
}
/**
* 管理任务
* @param task
*/
public void remove(Runnable task){
initThreadPoolExecutor();
mExecutor.remove(task);
}
}
//threadPoolProxyFactory.java线程池工厂 这里可以创建两种类型的线程池
public class ThreadPoolProxyFactory {
static ThreadPoolProxy mNormalThreadPoolProxy;
static ThreadPoolProxy mDownloadThreadPoolProxy;
/**
* 得到普通线程池的代理对象
*/
public static ThreadPoolProxy getNormalThreadPoolProxy() {
if (mNormalThreadPoolProxy == null) {
synchronized (ThreadPoolProxyFactory.class) {
if (mNormalThreadPoolProxy == null) {
mNormalThreadPoolProxy = new ThreadPoolProxy(5, 5);
}
}
}
return mNormalThreadPoolProxy;
}
/**
* 得到下载任务需要的线程池的代理对象
*/
public static ThreadPoolProxy getDownloadThreadPoolProxy() {
if (mDownloadThreadPoolProxy == null) {
synchronized (ThreadPoolProxyFactory.class) {
if (mDownloadThreadPoolProxy == null) {
mDownloadThreadPoolProxy = new ThreadPoolProxy(3, 3);
}
}
}
return mDownloadThreadPoolProxy;
}
}
//使用
//new Thread(mLoadDataTask).start();
ThreadPoolProxyFactory.getNormalThreadPoolProxy().submit(Runnable task);