import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* 线程池的管理类,单例
*/
public class MyThreadPoolManager {
private MyThreadPoolManager(){}
private static MyThreadPoolManager instance ;
public synchronized static MyThreadPoolManager getInstance() {
if(instance == null) {
instance = new MyThreadPoolManager();
}
return instance;
}
//线程池 线程池的使用场景:用一个线程池来管理一个模块,比如线程池管理下载的模块
//如果使用线程池来管理这个程序中所有的子线程,有可能会造成最基本的功能(网络数据的加载)都使用不了了
private ThreadPoolExecutor executor;
//线程池中存放的是线程,我们对于线程池需要做什么操作呢?
//我们所需要做的事情就是往线程池里面丢任务
//Thread
//Runnable
public void execute(Runnable r){
if(executor == null) {
/**
int corePoolSize,核心线程的数量,在正常情况下,线程池中同时运行的线程的数量
int maximumPoolSize,最大线程的数量,在非正常的情况下(等待区域满了的情况下),线程池中同时运行的线程的数量
long keepAliveTime,空闲时间 5
TimeUnit unit,空闲时间的单位
BlockingQueue<Runnable> workQueue,等待区域
ThreadFactory threadFactory,线程创建的工厂
RejectedExecutionHandler handler 异常处理机制
*/
executor = new ThreadPoolExecutor(
3,5,0,
TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(20),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy());
int cpuCount = Runtime.getRuntime().availableProcessors();
int corePoolSize = cpuCount*2 + 1;
}
//把任务丢到线程池里面去
executor.execute(r);
}
public void cancle(Runnable runnable) {
if(executor != null) {
executor.getQueue().remove(runnable);
}
}
}