前言:单线程单任务,后提交的任务会挤掉前面的任务。前面已经写过一个SingleTaskPool单线程单任务--线程池工具类
功能基本上是一样的,只是MultiSingleTaskPool可以同时管理多个线程池,而SingleTaskPool只管理一个。
因为所谓‘单线程单任务’,也就是单一类型的任务提交到一个单一的线程中,目的是为了执行无谓的重复任务,节省资源,提高性能。如果单一线程提交了不同任务,又因为后提交的任务会挤掉前面的任务,所以有可能造成任务没有被执行到就被挤掉了。
所以写了这个工具类,通过提交不同的字符串作为标志,维护不同的、多个的‘单线程单任务’线程池,以此来执行不同工作内容的任务,避免任务混乱。
/**
* @desc
* @auth 方毅超
* @time 2017/12/18 15:05
*/
public class MultiSingleTaskPool {
private static Map<String, ThreadPoolExecutor> pools = null;
/**
* 初始化线程池
*/
private static ThreadPoolExecutor init(String poolName) {
if (pools == null) pools = new HashMap<>();
if (pools.get(poolName) == null) {
// 创建线程池。线程池的"最大池大小"和"核心池大小"都为1(THREADS_SIZE),"线程池"的阻塞队列容量为1(CAPACITY)。
ThreadPoolExecutor pool = new ThreadPoolExecutor(1, 1, 20L, TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(1));
// 设置线程池的拒绝策略为"DiscardOldestPolicy",当有任务添加到线程池被拒绝时,线程池会丢弃阻塞队列中末尾的任务,然后将被拒绝的任务添加到末尾
pool.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardOldestPolicy());
pools.put(poolName, pool);
}
return pools.get(poolName);
}
/**
* 提交任务执行
*/
public static void execute(String poolName, Runnable r) {
init(poolName).execute(r);
}
/**
* 关闭线程池
*/
public static void unInit(String poolName) {
ThreadPoolExecutor pool = pools.get(poolName);
if (pool == null || pool.isShutdown()) return;
pool.shutdownNow();
pools.remove(pool);
}
/**
* 关闭所有线程池
*/
public static void unInitPools() {
if (pools == null) return;
for (Map.Entry<String, ThreadPoolExecutor> entry : pools.entrySet()) {
entry.getValue().shutdownNow();
}
pools.clear();
// pools = null;
}
}
用法更加粗暴、简单:
MultiSingleTaskPool.execute("saveCubeApplication", new Runnable() {
@Override
public void run() {
CubeApplication application = CubeApplication.getInstance(ctx);
application.save(application);
}
});
网友评论