Java线程池的使用及原理分析
概述 线程池是管理一组同构工作线程的资源池。合理利用线程池能够带来三个好处。第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。第三:提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。但是要做到合理的利用线程池,必须对其原理了如指掌。 Java中线程池的基础架构 线程池的使用及原理分析 由于在JDK中内部提供的许多线程池都是基于ThreadPoolExecutor的,因此下面先介绍ThreadPoolExecutor的相关原理。 ThreadPoolExecutor 使用ThreadPoolExecutor Java中可以通过ThreadPoolExecutor来创建一个线程池: public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler); 参数介绍: corePoolSize:核心线程数量。 maximumPoolSize:最大线程数,线程池允许创建的最大线程数。 keepAliveTime:超出corePoolSize后创建的线程的存活时间。 unit:keepAliveTime的时间单位。 workQueue:任务队列,用于保存待执行的任务。 threadFactory:线程池内部创建线程所用的工厂。 handler:任务无法执行时的处理器。 使用ThreadPoolExecutor+单例模式实现一个简单的线程池: import java.util.List; import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicInteger; public class MyThreadPool { private final String THREAD_TAG = this.getClass().getSimpleName(); /** * 定义ThreadPoolExecutor需要的必要参数 */ private static final int CORE_POOL_SIZE = Runtime.getRuntime().availableProcessors() * 2; private static final int MAX_POOL_SIZE = 64; private static final int KEEP_ALIVE_TIME = 1; /** * 工作队列,使用LinkedBlockingQueue */ private final BlockingQueue<Runnable> mWorkQueue = new LinkedBlockingQueue<>(); /** * 定义创建线程的工厂 */ private final ThreadFactory mThreadFactory = new ThreadFactory() { private final AtomicInteger threadCount = new AtomicInteger(0); @Override public Thread newThread(Runnable r) { Thread thread = new Thread(r, THREAD_TAG + "#" + threadCount....