今天我在原来的公司离职了,以后我还是会继续努力加油工作!
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* 管理线程池
*
* @author itcast
*
*/
public class ThreadManager {
private ThreadManager() {
}
//线程池管理者实例
private static ThreadManager instance = new ThreadManager();
public static ThreadManager getInstance() {
return instance;
}
private ThreadPoolProxy longPool; //多线程的线程池
private ThreadPoolProxy shortPool; //少线程的线程池
//一个线程池管理者可以new 多个线程池
// 联网比较耗时,本线程池可以用于联网操作
// 一般new几个线程=cpu的核数*2+1
public synchronized ThreadPoolProxy createLongPool() {
if (longPool == null) { //先开5个线程,不够用再开5个,如果线程池没有要执行的任务 存活5s
longPool = new ThreadPoolProxy(5, 5, 5000L);
}
return longPool;
}
// 操作本地文件的线程池 synchronized 加锁,让线程同步
public synchronized ThreadPoolProxy createShortPool() {
if(shortPool==null){ //先开3个线程,不够用再开3个,如果线程池没有要执行的任务 存活5s
shortPool = new ThreadPoolProxy(3, 3, 5000L);//L是long类型的后缀
}
return shortPool;
}
//内部类,用于创建线程池
public class ThreadPoolProxy {
// ThreadPoolExecutor 是Java提供的线程池
private ThreadPoolExecutor pool;
private int corePoolSize;
private int maximumPoolSize;
private long time;
//构造函数,里面的参数是ThreadPoolExecutor的参数
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) {
// 创建线程池,参数的解释
/*
* 1. 线程池里面管理多少个线程 2. 如果排队满了, 额外的开的线程数3. 如果线程池没有要执行的任务 存活多久4.
* 时间的单位 5 如果 线程池里管理的线程都已经用了,剩下的任务 临时存到LinkedBlockingQueue对象中 排队
*/
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() {
//执行耗时操作!
}
});