package com.mandi.fendan.util; import javax.validation.constraints.NotNull; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; /** * 线程池的工具类 * 用于进行线程的管理,防止重复创建、杀死线程。 * * 多线程运行期间,如果系统不断的创建、杀死新线程, * 会产生过度消耗系统资源,以及过度切换线程的问题,甚至可能导致系统资源的崩溃。 * 因此需要线程池,对线程进行管理。 */ public class ThreadPoolUtil { private String TAG = getClass().getName(); private static volatile ThreadPoolUtil mInstance; //核心线程池的数量,同时能够执行的线程数量 private int corePoolSize; //最大线程池数量,表示当缓冲队列满的时候能继续容纳的等待任务的数量 private int maxPoolSize; //存活时间 private long keepAliveTime = 1; private TimeUnit unit = TimeUnit.HOURS; // private ThreadPoolExecutor executor; ScheduledThreadPoolExecutor executor; private ThreadPoolUtil() { //给corePoolSize赋值:当前设备可用处理器核心数*2 + 1,能够让cpu的效率得到最大程度执行(有研究论证的) corePoolSize = Runtime.getRuntime().availableProcessors() * 2 + 1; maxPoolSize = corePoolSize; // executor = new ThreadPoolExecutor( // //当某个核心任务执行完毕,会依次从缓冲队列中取出等待任务 // corePoolSize, // // 然后new LinkedBlockingQueue(),然后maximumPoolSize,但是它的数量是包含了corePoolSize的 // maxPoolSize, // //表示的是maximumPoolSize当中等待任务的存活时间 // keepAliveTime, // unit, // //缓冲队列,用于存放等待任务,Linked的先进先出 // new LinkedBlockingQueue(), // new DefaultThreadFactory(Thread.NORM_PRIORITY, "thread-pool-"), // new ThreadPoolExecutor.AbortPolicy() // ); executor = new ScheduledThreadPoolExecutor(corePoolSize); } public static ThreadPoolUtil getInstance() { if (mInstance == null) { synchronized (ThreadPoolUtil.class) { if (mInstance == null) { mInstance = new ThreadPoolUtil(); } } } return mInstance; } /** * 执行任务 * * @param runnable */ public void execute(Runnable runnable) { checkNull(); if (runnable != null) { executor.execute(runnable); } } void checkNull() { if (executor == null) { // executor = new ThreadPoolExecutor( // corePoolSize, // maxPoolSize, // keepAliveTime, // TimeUnit.SECONDS, // new LinkedBlockingQueue(), // new DefaultThreadFactory(Thread.NORM_PRIORITY, "thread-pool-"), // new ThreadPoolExecutor.AbortPolicy()); executor = new ScheduledThreadPoolExecutor(corePoolSize, new DefaultThreadFactory(Thread.NORM_PRIORITY, "thread-pool-"), new ThreadPoolExecutor.AbortPolicy()); } } /** * * @param runnable * @param delay 延迟执行,单位毫秒 */ public void execute(Runnable runnable,long delay) { checkNull(); if (runnable != null) { executor.schedule(runnable, delay, TimeUnit.MILLISECONDS); } } /** * 移除任务 * * @param runnable */ public void remove(Runnable runnable) { if (runnable != null) { executor.remove(runnable); } } private static class DefaultThreadFactory implements ThreadFactory { //线程池的计数 private static final AtomicInteger poolNumber = new AtomicInteger(1); //线程的计数 private final AtomicInteger threadNumber = new AtomicInteger(1); private final ThreadGroup group; private final String namePrefix; private final int threadPriority; DefaultThreadFactory(int threadPriority, String threadNamePrefix) { this.threadPriority = threadPriority; this.group = Thread.currentThread().getThreadGroup(); this.namePrefix = threadNamePrefix + poolNumber.getAndIncrement() + "-thread-"; } @Override public Thread newThread(@NotNull Runnable r) { Thread thread = new Thread(group, r, namePrefix + threadNumber.getAndIncrement(), 0); // 返回True该线程就是守护线程 // 守护线程应该永远不去访问固有资源,如:数据库、文件等。因为它会在任何时候甚至在一个操作的中间发生中断。 if (thread.isDaemon()) { thread.setDaemon(false); } thread.setPriority(threadPriority); return thread; } } }