线程池原理
public class ThreadPool {
int maxCount = 3;
AtomicInteger count =new AtomicInteger(0);
LinkedList<Runnable> runnables = new LinkedList<Runnable>();
/**
*1.将要执行任务添加到list缓存
*2、当前开的线程数(原子变量)++
*3、判断当前开的线程数小于等于最大数目,则创建新线程
*count.incrementAndGet():increment是++;Get拿到当前count值
*/
public void execute(Runnable runnable) {
runnables.add(runnable);
if(count.incrementAndGet()<=3){
createThread();
}
}
/**
*要开启的线程内情况:
*1、判断Runnable集合大小,不为空,取出来那个异步任务
*2、任务不为空,就放在线程内执行
*3、任务集合为空,即任务都执行完了,此时线程等待
*/
private void createThread() {
new Thread() {
@Override
public void run() {
super.run();
while (true) {
if (runnables.size() > 0) {
Runnable remove = runnables.remove(0);
if (remove != null) {
remove.run();
}
}else{
}
}
}
}.start();
}
}
线程池应用
- 写个工具类ThreadManager
/**
* 管理线程池
*
* @author stephen
*
*/
public class ThreadManager {
private ThreadManager() {
}
private static ThreadManager instance = new ThreadManager();
private ThreadPoolProxy longPool;
private ThreadPoolProxy shortPool;
public static ThreadManager getInstance() {
return instance;
}
public synchronized ThreadPoolProxy createLongPool() {
if (longPool == null) {
longPool = new ThreadPoolProxy(5, 5, 5000L);
}
return longPool;
}
public synchronized ThreadPoolProxy createShortPool() {
if(shortPool==null){
shortPool = new ThreadPoolProxy(3, 3, 5000L);
}
return shortPool;
}
public class ThreadPoolProxy {
private ThreadPoolExecutor pool;
private int corePoolSize;
private int maximumPoolSize;
private long time;
public ThreadPoolProxy(int corePoolSize, int maximumPoolSize, long time) {
this.corePoolSize = corePoolSize;
this.maximumPoolSize = maximumPoolSize;
this.time = time;
}
/**
* 执行任务
* @param runnable
*/
public void execute(Runnable runnable) {
if (pool == null) {
pool = new ThreadPoolExecutor(corePoolSize, maximumPoolSize,
time, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(10));
}
pool.execute(runnable);
}
/**
* 取消任务
* @param runnable
*/
public void cancel(Runnable runnable) {
if (pool != null && !pool.isShutdown() && !pool.isTerminated()) {
pool.remove(runnable);
}
}
}
}
- 在其他类中应用线程池执行异步任务
ThreadManager.getInstance().createLongPool().execute(new Runnable() {
@Override
public void run() {
}
});