MultiSingleTaskPool多元单线程单任务--线程池工具类

前言:单线程单任务,后提交的任务会挤掉前面的任务。前面已经写过一个SingleTaskPool单线程单任务--线程池工具类
功能基本上是一样的,只是MultiSingleTaskPool可以同时管理多个线程池,而SingleTaskPool只管理一个。
因为所谓‘单线程单任务’,也就是单一类型的任务提交到一个单一的线程中,目的是为了执行无谓的重复任务,节省资源,提高性能。如果单一线程提交了不同任务,又因为后提交的任务会挤掉前面的任务,所以有可能造成任务没有被执行到就被挤掉了。
所以写了这个工具类,通过提交不同的字符串作为标志,维护不同的、多个的‘单线程单任务’线程池,以此来执行不同工作内容的任务,避免任务混乱。

/**
 * @desc
 * @auth 方毅超
 * @time 2017/12/18 15:05
 */

public class MultiSingleTaskPool {
    private static Map 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(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 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);
                }
            });

你可能感兴趣的:(MultiSingleTaskPool多元单线程单任务--线程池工具类)