关于thread:线程池-ThreadPoolExecutor-详解
一 为什么要应用线程池对于操作系统而言,创立一个线程的代价是非常低廉的, 须要给它分配内存、列入调度,同时在线程切换时要执行内存换页,清空 CPU 缓存,切换回来时还要从新从内存中读取信息,毁坏了数据的局部性。因而在并发编程中,当线程创立过多时,会影响程序性能,甚至引起程序解体。而线程池属于池化管理模式,具备以下长处: 升高资源耗费:通过反复利用已创立的线程升高线程创立和销毁造成的性能耗费。进步响应速度:当工作达到时,工作能够不须要等到线程创立就能立刻执行。进步线程的可管理性:可能对线程进行统一分配、调优和监控。 二 线程池原理详解2.1 线程池外围组成线程池蕴含 3 个外围局部: 线程汇合:外围线程和工作线程阻塞队列:用于待执行工作排队回绝策略处理器:阻塞队列满后,对工作解决进行 2.2 Execute 原理当一个新工作提交至线程池之后,线程池的解决流程如下: 首先判断以后运行的线程数量是否小于 corePoolSize。如果是,则创立一个工作线程来执行工作;如果都在执行工作,则进入步骤 2。判断 BlockingQueue 是否曾经满了,若没满,则将工作放入 BlockingQueue;若满了,则进入步骤 3。判断以后运行的总线程数量是否小于 maximumPoolSize,如果是则创立一个新的工作线程来执行工作。否则交给 RejectedExecutionHandler 来解决工作。 当 ThreadPoolExecutor 创立新线程时,通过 CAS 来更新线程池的状态 ctl。 三 线程池的应用线程池的应用次要分为以下三个步骤: 3.1 创立线程池3.1.1 自定义线程池线程池的真正实现类是 ThreadPoolExecutor,其构造方法有如下 4 种:public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) { this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, Executors.defaultThreadFactory(), defaultHandler);} public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory) { this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, defaultHandler);} public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler) { this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, Executors.defaultThreadFactory(), handler);} public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) { if (corePoolSize < 0 || maximumPoolSize <= 0 || maximumPoolSize < corePoolSize || keepAliveTime < 0) throw new IllegalArgumentException(); if (workQueue == null || threadFactory == null || handler == null) throw new NullPointerException(); this.corePoolSize = corePoolSize; this.maximumPoolSize = maximumPoolSize; this.workQueue = workQueue; this.keepAliveTime = unit.toNanos(keepAliveTime); this.threadFactory = threadFactory; this.handler = handler;}复制代码上面具体来看构造函数须要传入的重点参数: ...