package com.lqr.wechat.thread;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* @创建者 CSDN_LQR
* @描述 创建线程池,执行任务,提交任务
*/
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 LinkedBlockingDeque<Runnable>();// 无界队列
ThreadFactory threadFactory = Executors
.defaultThreadFactory();
RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy();// 任务数量超过时,丢弃任务,抛出异常
mExecutor = new ThreadPoolExecutor(//
mCorePoolSize, // 核心线程数
mMaximumPoolSize,// 最大线程数
mKeepAliveTime, // 保持时间
unit, // 保持时间对应的单位
workQueue,// 缓存队列/阻塞队列
threadFactory,// 线程工厂
handler// 异常捕获器
);
}
}
}
return mExecutor;
}
/**
* 执行任务
*
* @param task
*/
public void execute(Runnable task) {
initThreadPoolExecutor();
mExecutor.execute(task);
}
/**
* 提交任务
*
* @param task
*/
public Future<?> submit(Runnable task) {
initThreadPoolExecutor();
return mExecutor.submit(task);
}
/**
* 移除任务
*
* @param task
*/
public void removeTask(Runnable task) {
initThreadPoolExecutor();
mExecutor.remove(task);
}
}