執行緒池的封裝和使用(代理模式工廠模式)
阿新 • • 發佈:2019-02-15
通過執行緒池代理類和執行緒池工廠完成對執行緒池操作的解耦。
簡單的代理模式和簡單的工廠模式
1.建立一個代理類
public class ThreadPoolProxy {
ThreadPoolExecutor mExecutor; // 只需建立一次
int mCorePoolSize;
int mMaximumPoolSize;
long mKeepAliveTime;
public ThreadPoolProxy(int corePoolSize, int maximumPoolSize, long keepAliveTime) {
super();
mCorePoolSize = corePoolSize;
mMaximumPoolSize = maximumPoolSize;
mKeepAliveTime = keepAliveTime;
}
private ThreadPoolExecutor initThreadPoolExecutor() {//雙重檢查加鎖
if (mExecutor == null) {
synchronized (ThreadPoolProxy.class) {
if (mExecutor == null) {
TimeUnit unit = TimeUnit.MILLISECONDS;
BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<Runnable>();// 無界佇列
ThreadFactory threadFactory = Executors.defaultThreadFactory();
RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy();// 丟棄任務並丟擲RejectedExecutionException異常。
mExecutor = new ThreadPoolExecutor(//
mCorePoolSize,// 核心的執行緒數
mMaximumPoolSize,// 最大的執行緒數
mKeepAliveTime, // 保持時間
unit, // 保持時間對應的單位
workQueue,// 快取佇列/阻塞佇列
threadFactory, // 執行緒工廠
handler// 異常捕獲器
);
}
}
}
return mExecutor;
}
/**執行任務*/
public void execute(Runnable task) {
initThreadPoolExecutor();
mExecutor.execute(task);
}
/**提交任務*/
public Future<?> submit(Runnable task) {
initThreadPoolExecutor();
return mExecutor.submit(task);
}
/**移除任務*/
public void removeTask(Runnable task) {
initThreadPoolExecutor();
mExecutor.remove(task);
}
}
代理類將執行緒池單例化。並提供了幾個核心的操作方法。屬於將執行緒池構建的放法進行抽取。
2.建立工廠類
public class ThreadPoolFactory {
static ThreadPoolProxy mNormalPool;
static ThreadPoolProxy mDownLoadPool;
/**得到一個普通的執行緒池*/
public static ThreadPoolProxy getNormalPool() {
if (mNormalPool == null) {
synchronized (ThreadPoolProxy.class) {
if (mNormalPool == null) {
mNormalPool = new ThreadPoolProxy(5, 5, 3000);
}
}
}
return mNormalPool;
}
/**得到一個下載的執行緒池*/
public static ThreadPoolProxy getDownLoadPool() {
if (mDownLoadPool == null) {
synchronized (ThreadPoolProxy.class) {
if (mDownLoadPool == null) {
mDownLoadPool = new ThreadPoolProxy(3, 3, 3000);
}
}
}
return mDownLoadPool;
}
}
3.使用
ThreadPoolFactory.getDownLoadPool().execute(task);
希望能對開源框架的封裝有一些啟發。