/**
* 线程池管理
*/
public class ThreadPoolManager {
private ThreadPoolManager() {
}
//懒汉式 是加同步锁
// 饿汉式 线程安全
private static ThreadPoolManager instance = new ThreadPoolManager();
private PoolProxy longPoolProxy; // 给联网使用的线程池
private PoolProxy shortPoolProxy; // 读写文件使用的线程池
public static ThreadPoolManager getInstance() {
return instance;
}
// 联网
// 读写文件
// 效率最高 cpu 核心数 *2+1
// 1 *2+1
public PoolProxy createLongThreadPool() {
if (longPoolProxy == null) {
longPoolProxy = new PoolProxy(5, 5, 5000);
}
return longPoolProxy;
}
public PoolProxy createShortThreadPool() {
if (shortPoolProxy == null) {
shortPoolProxy = new PoolProxy(3, 3, 5000);
}
return shortPoolProxy;
}
/**
* 配置线程池 代理类 ThreadPoolExecutor 线程池
*
* @author wxj
*
*/
public class PoolProxy {
private int corePoolSize;
private int maximumPoolSize;
private long time;
private ThreadPoolExecutor threadPool; // 线程池
public PoolProxy(int corePoolSize, int maximumPoolSize, long time) {
super();
this.corePoolSize = corePoolSize;
this.maximumPoolSize = maximumPoolSize;
this.time = time;
}
@SuppressLint("NewApi")
public void execute(Runnable r) {
/**
* 1.corePoolSize 初始化线程数量 2.maximumPoolSize 出了初始化 线程数量 另外最多 能创建的线程数量
* 3.keepAliveTime 如果没有任务 最多的存活时间 4. TimeUnit时间单位
*/
if (threadPool == null) { // 当线程池 为空的时候才去创建
threadPool = new ThreadPoolExecutor(corePoolSize,
maximumPoolSize, time, TimeUnit.MILLISECONDS,
new LinkedBlockingDeque
(10));
}
// 就直接执行任务
threadPool.execute(r);
}
public void cancel(Runnable r) {
// threadPool 不能为空 threadPool 没有崩溃 threadPool 没有停止
if (threadPool != null && !threadPool.isShutdown()
&& !threadPool.isTerminated()) {
threadPool.remove(r);
}
}
}
}
这里在线程池里做好对线层的处理然后就是调用 创建一个线层的工具类,
public class ThreadUtils {
/**
* 子线程执行 给联网 ... 特别耗时的 操作使用
* @param r
*/
public static void runOnBackThread(Runnable r){
// new Thread(r).start();
ThreadPoolManager.getInstance().createLongThreadPool().execute(r);
}
/**
* 子线程执行 给相对联网 耗时少的操作使用
* @param r
*/
public static void runOnShortBackThread(Runnable r){
// new Thread(r).start();
ThreadPoolManager.getInstance().createShortThreadPool().execute(r);
}
private static Handler handler = new Handler();
/**
* 在主线程执行
* @param r
*/
public static void runOnUiThread(Runnable r){
handler.post(r);
}
}
然后下一步就是在界面代码中哪里用到 就在哪里调用工具类的线层:
runOnBackThread (); runOnShortBackThread(); runOnUiThread();