注意:removeTask()方法起作用有一个必要的前提,就是这个任务还没有开始执行,如果已经开始执行了,就停止不了该任务了,这个方法就不会起作用
工具类:
/**
*线程池代理类
*/
public class ThreadPoolProxy {
ThreadPoolExecutor mThreadPoolExecutor;
private int corePoolSize;
private int maximumPoolSize;
private long keepAliveTime;
public ThreadPoolProxy(int corePoolSize, int maximumPoolSize, long keepAliveTime) {
this.corePoolSize = corePoolSize;
this.maximumPoolSize = maximumPoolSize;
this.keepAliveTime = keepAliveTime;
}
private ThreadPoolExecutor initExecutor() {
if(mThreadPoolExecutor == null) {
synchronized(ThreadPoolProxy.class) {
if(mThreadPoolExecutor == null) {
TimeUnit unit = TimeUnit.MILLISECONDS;
ThreadFactory threadFactory = Executors.defaultThreadFactory();
RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy();
LinkedBlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>();
mThreadPoolExecutor = new ThreadPoolExecutor(
corePoolSize,//核心线程数
maximumPoolSize,//最大线程数
keepAliveTime,//保持时间
unit,//保持时间对应的单位
workQueue,
threadFactory,//线程工厂
handler);//异常捕获器
}
}
}
return mThreadPoolExecutor;
}
/**执行任务*/
public void executeTask(Runnable r) {
initExecutor();
mThreadPoolExecutor.execute(r);
}
/**提交任务*/
public Future<?> commitTask(Runnable r) {
initExecutor();
return mThreadPoolExecutor.submit(r);
}
/**删除任务*/
public void removeTask(Runnable r) {
initExecutor();
mThreadPoolExecutor.remove(r);
}
}
使用方法:
创建线程池代理类和runnable对象
private ThreadPoolProxy threadPoolProxy = new ThreadPoolProxy(1, 1, 3000);
private Runnable runnable = new Runnable() {
@Override
public void run() {
//TODO
}
};
对runnable对象进行操作:
threadPoolProxy.executeTask(runnable);
threadPoolProxy.removeTask(runnable);