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; } } }