1. 程式人生 > >執行緒池的封裝和使用(代理模式工廠模式)

執行緒池的封裝和使用(代理模式工廠模式)

通過執行緒池代理類和執行緒池工廠完成對執行緒池操作的解耦。
簡單的代理模式和簡單的工廠模式

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);

希望能對開源框架的封裝有一些啟發。