[JDK] ThreadPoolExecutor 线程池配置 和 阻塞队列BlockingQueue 创建和配置 ExecutorService 执行器服务,它使用可能的几个池线程之一执行每个提交的任务...每个ThreadPoolExecutor 还维护着一些基本的统计数据,如完成的任务数。 为了便于跨大量上下文使用,此类提供了很多可调整的参数和扩展挂钩。...否则,在手动配置和调整此类时,使用以下指导: 核心和最大池大小 ThreadPoolExecutor 将根据 corePoolSize(参见 getCorePoolSize())和 maximumPoolSize...队列大小和最大池大小可能需要相互折衷:使用大型队列和小型池可以最大限度地降低CPU 使用率、操作系统资源和上下文切换开销,但是可能导致人工降低吞吐量。...任务排队有3种基本方法:无限队列、有限队列和同步移交。
本文章对ThreadPoolExecutor线程池的底层源码进行分析,线程池如何起到了线程复用、又是如何进行维护我们的线程任务的呢?...我们直接进入正题: 首先我们看一下ThreadPoolExecutor类的源码 1 public ThreadPoolExecutor(int corePoolSize, 2...根据传进来的任务参数判断是请求数据,还是存入数据//第二步:如果是存入数据,空节点时直接返回null,让线程池创建worker线程运行任务,如果有等待节点,那么存入当前任务数据,并且再移除存入的数据节点和等待的节点...而PriorityBlockingQueue和DelayQueue,虽然内部都使用了PriorityQueue作为存储介质,但是PriorityBlockingQueue不会强制要求你使用哪一种比较器,...最后说一下SynchronousQueue,该队列比其他队列特殊一点,该队列是同步类型的队列,就是说队列不存储任务数据,而是必须有正在获取的等待节点才会让数据暂时放入队列中然后立马取出,或者不会放入队列
之前工作中发现有同事在使用线程池的时候经常搞混淆ThreadPoolTaskExecutor和ThreadPoolExecutor,座椅在这里想写一片博客来讲讲这两个线程池的区别以及使用 ThreadPoolExecutor...,队列中保存着所有等待状态的线程。...());//配置拒绝策略 return executor; } 上面注解中已经注释了参数的详解,这里重点讲解一下spring线程池的拒绝策略和处理流程。...2.查看任务队列是否已满,不满就将任务存储在任务队列中,否则执行第三步。 3.查看线程池是否已满,即就是是否达到最大线程池数,不满就创建一条线程执行任务,否则就按照策略处理无法执行的任务。...流程图如下 总结:本篇文章主要讲了一下JDK线程池和spring线程池这两个线程池,具体实际业务则和平时使用一样。下一篇文章将讲一下如何使用spring的异步多线程调用注解@Async使用。
、 Executors 参数详解与源代码分析 https://www.cnblogs.com/nullzx/p/5184164.html 线程池实例:使用Executors和ThreadPoolExecutor...ScheduledThreadPoolExecutor : 实现了 ScheduledExecutorService: , 因为它作为一个使用 corePoolSize 线程和一个无界队列的固定大小的池...说明: Executors中各个方法的弊端: 1) – newFixedThreadPool 创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程。...– newSingleThreadExecutor 创建一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程。...问题:主要是堆积的请求处理队列可能会耗费非常大的内存,导致OOM!
7681529.html 解决问题: 1、 处理大量异步任务时能减少每个任务的资源开销; 2、 线程通过线程池管理,减少线程的资源开销; 3、 统计当前任务完成数量以及活跃线程数; 个人认为关键是线程池与任务队列如何完美协作...通过下图说明ThreadPoolExecutor机制 ?...,减慢任务入队列的时间, 从而达到线程处理任务的速度快于任务到达队列的速度; 优点:不抛出异常中断线程,不丢失任务;如下图 ?...c> ThreadPoolExecutor.DiscardPolicy: 直接扔掉任务 d> ThreadPoolExecutor.DiscardOldestPolicy: 按照进入顺序扔掉队列另一端最先进入的任务...,腾出空间,然后将新任务入队列; 不要让懒惰占据你的大脑,不要让妥协拖垮你的人生。
项目中有一个水平分库读写数据的场景,采用了Spring支持的分库策略AbstractRoutingDataSource,数据源名称采用了ThreadLocal来保存,具体执行读写库操作采用ThreadPoolExecutor...ThreadLocal会为每个线程保存一份成员变量的副本,而ThreadPoolExecutor是一些线程不断执行各种任务(线程复用)。...比如,你让具有3个线程的ThreadPoolExecutor执行13个任务,那么有一个线程会执行5个任务,另外两个线程执行4个任务。
ThreadPoolExecutor 源码解析...分为两大类:workerCount(当前运行的线程数) runState(当前线程的运行状态) 1、runState运行状态: a> RUNNING : 接受新的任务以及处理队列中的任务...; b> SHUTDOWN : 不接受新的任务,但是可以处理队列任务; c> STOP : 不接受新的任务,不处理队列任务,中断正在处理的任务; d> TIDYING :...也许隐含在finalize()) b> (RUNNING or SHUTDOWN) -> STOP 调用shutdownNow() c> SHUTDOWN -> TIDYING 当队列无任务以及线程池无线程
只是保证了他和其他函数对 value 值得更新都是有效的。 整个方法本身并不是线程安全的,但通过compareAndSet方法,可以达到安全操作的效果。...ThreadPoolExecutor执行流程 public void execute(Runnable command) { if (command == null)
ThreadPoolExecutor service = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit...service.getActiveCount(); // 获取活跃线程数(正在执行任务的线程数)Copy to clipboardErrorCopied提交任务可以向线程池提交的任务有两种:Runnable 接口和...service.shutdownNow(); // 线程池不再接受新的任务并对所有线程执行 interrupt 操作,清空队列并终止。...service.getActiveCount(); // 获取活跃线程数(正在执行任务的线程数)Copy to clipboardErrorCopied提交任务可以向线程池提交的任务有两种:Runnable 接口和...service.shutdownNow(); // 线程池不再接受新的任务并对所有线程执行 interrupt 操作,清空队列并终止。
ThreadPoolExecutor 代码流程图 本文系作者原创,转载请注明出处:http://www.cnblogs.com/further-further-further.../p/7681648.html 1、ThreadPoolExecutor代码实现机制主要是线程池处理任务以及任务队列相关操作 ThreadPoolExecutor线程处理任务流程图 ?...2、任务队列操作流程图 ? 不要让懒惰占据你的大脑,不要让妥协拖垮你的人生。青春就是一张票,能不能赶上时代的快车,你的步伐掌握在你的脚下。
线程池类为 java.util.concurrent.ThreadPoolExecutor,常用构造方法为: ThreadPoolExecutor(intcorePoolSize, int maximumPoolSize...2、如果此时线程池中的数量等于 corePoolSize,但是缓冲队列workQueue未满,那么任务被放入缓冲队列。...,他会自动重复调用execute()方法 3、ThreadPoolExecutor.DiscardOldestPolicy() 抛弃旧的任务 4、ThreadPoolExecutor.DiscardPolicy...4、通过调整 produceTaskSleepTime和consumeTaskSleepTime的大小来实现对派发任务和处理任务的速度的控制,改变这两个值就可以观察不同速率下程序的工作情况。...6、对于其他的使用方法,参看jdk的帮助,很容易理解和使用。
线程池状态 ThreadPoolExecutor 使用 int 的高 3 位来表示线程池状态,低 29 位表示线程数量 状态名 高 3 位 接收新任务 处理阻塞队列任务 说明 RUNNING 111...Y Y SHUTDOWN 000 Y Y 不会接收新任务,但会处理阻塞队列剩余任务 STOP 001 N N 会中断正在执行的任务,并抛弃阻塞队列任务 TIDYING 010 - - 任务全部执行完毕...如果队列选择了有界队列,那么任务超过了队列大小时,会创建 maximumPoolSize - corePoolSize 数目的线 程来救急。...的实现,它使用了一个拒绝策略链,会逐一尝试策略链中每种拒绝策略 当高峰过去后,超过corePoolSize 的救急线程如果一段时间没有任务做,需要结束节省资源,这个时间由keepAliveTime 和...中特有的方法 Executors.newFixedThreadPool(1) 初始时为1,以后还可以修改 对外暴露的是 ThreadPoolExecutor 对象,可以强转后调用 setCorePoolSize
ThreadPoolExecutor详解 一. 概述 ThreadPoolExecutor是JDK提供的线程池的基类,其中定义了线程池的核心框架,并且允许客户端通过继承的方式实现自定义的线程池。...JDK提供默认的几种线程池都继承了ThreadPoolExecutor类,因此有必要对ThreadPoolExecutor进行详细的分析。 二....workQueue是JDK中BlockingQueue的实现类,可以使用ArrayBlockingQueue有界队列、LinkedBlockingQueue无界队列或其他类型的阻塞队列,这里不再展开。...源码分析 ThreadPoolExecutor有一个内部类Worker,它是对Runnable进行了封装,主要功能是对待执行的任务进行中断处理和状态监控。...内部一个用来进行技术和状态控制的控制变量,它使用了一个原子整形字段来实现两个方面的管理: 记录当前有效线程的数量; 记录当前线程池的状态,如允许、关闭等。
但是,对于初学者往往对Executor,Executors,ExecutorService,ThreadPoolExecutor傻傻分不清,小文特别梳理总结了,用于工作学习。...Executors及其ExecutorService: Executor框架便是Java 5中引入的,其内部使用了线程池机制,它在java.util.cocurrent包下,通过该框架来控制线程的启动、执行和关闭...2、无界队列。...使用无界队列(典型的便是采用预定义容量的 LinkedBlockingQueue,理论上是该缓冲队列可以对无限多的任务排队)将导致在所有 corePoolSize 线程都工作的情况下将新任务加入到缓冲队列中...当使用有限的 maximumPoolSizes 时,有界队列(一般缓冲队列使用ArrayBlockingQueue,并制定队列的最大长度)有助于防止资源耗尽,但是可能较难调整和控制,队列大小和最大池大小需要相互折衷
标准库concurrent.futures模块 它提供了ThreadPoolExecutor和ProcessPoolExecutor两个类, 分别实现了对threading模块和multiprocessing...简单代码演示 from concurrent.futures import ThreadPoolExecutor def get(run): print(" {}finished".format...(run)) # 创建线程池 # 设置线程池中最多能同时运行的线程数目,其他等待 executor = ThreadPoolExecutor(max_workers=2) # 通过submit函数提交执行的函数到线程池中...(2)线程池:异步 + 回调函数,IO密集型主要使用方式,线程池:执行操作为谁有空谁执行 from concurrent.futures import ThreadPoolExecutor def get...这个最好的方式 可以和队列放在一起去执行。 总结 线程不是越多越好,会涉及cpu上下文的切换(会把上一次的记录保存)。
Java有两个线程池类:ThreadPoolExecutor和ScheduledThreadPoolExecutor,且均继承于ExecutorService。...在 ThreadPoolExecutor 中通过两个量来控制线程池的大小:corePoolSize 和 maximumPoolSize。...2.ThreadPoolExecutor关闭线程池:线程池的关闭分为两种:平缓关闭(shutdown)和立即关闭(shutdownNow)。...这里的beforeExecute方法和afterExecute方法在ThreadPoolExecutor类中是空的,留给子类来实现。...runWorker()和getTask()这两个方法完成了任务的获取和阻塞线程的工作,大致流程: 通过 while 循环不断的从任务队列中获取任务,如果当前任务队列中没有任务,就阻塞线程。
我们上面讲解了 Executor框架以及 ThreadPoolExecutor 类,下面让我们实战一下,来通过写一个 ThreadPoolExecutor 的小 Demo 来回顾上面的内容。...构造函数自定义参数创建 ThreadPoolExecutor executor = new ThreadPoolExecutor( CORE_POOL_SIZE...workQueue:任务队列为 ArrayBlockingQueue,并且容量为 100; handler:饱和策略为 CallerRunsPolicy。...节中的 Demo 中我们使用 executor.execute(worker)来提交一个任务到线程池中去,这个方法非常重要,下面我们来看看它的源码: // 存放线程池的运行状态 (runState) 和线程池内有效线程的数量...command)) { int recheck = ctl.get(); // 再次获取线程池状态,如果线程池状态不是 RUNNING 状态就需要从任务队列中移除任务
print(s.pop()) print(s.pop()) print(s.pop()) print(s.pop()) print(s.pop()) 5 4 3 2 1 队列...概念 队列queue也是一种线性结构,方式是先进先出FIFO, 想象成一支队伍。...允许插入数据的一端:队尾 允许删除的一端:队头 假设队列q=(a_1, a_2 ,…, a_n),则a_1是队头元素,a_n是队尾元素。...__list.append(0, item) def dequeue(self): # 从队列头部删除元素:pop默认是末尾 return self....概念 能够在队头和队尾同时进行插入和删除操作的队列 实现 # coding: utf-8 # 双端队列 class Dueue(object): # Doublequeue # 构造函数
ThreadPoolExecutor继承AbstractExecutorService,层级实现了ExecutorService,ExecutorService继承了Executor 1 ....ThreadPoolExecutor 字段分析: ctl 的高位存储线程的运行状态,低位存储工作线程的数量,可见线程刚创建时线程状态为运行状态,工作线程数为0 COUNT_BITS用于决定线程状态移动的位数...static final int TERMINATED = 3 << COUNT_BITS; private final BlockingQueue workQueue;//阻塞队列...false //意思就是,当线程处于SHUTDOWN状态时,如果工作队列中还有任务,会将队列中任务执行完毕再终结线程池 if (rs >= SHUTDOWN...,再终结,而shutDownNow()会将工作队列中的任务都移除。
那么ThreadPoolExecutor就是用维护多线程的。作为工具类,ThreadPoolExecutor应该提供了很多操作线程的方法,按理说也是逐个去调用目标线程的方法。...那么我们就详细了解一下ThreadPoolExecutor的实现过程吧。我们发现ThreadPoolExecutor类继承了AbstractExecutorService。...应该和真正的线程start方法挂钩。在AbstractExecutorService方法中实现了ExecutorService的接口。...ExecutorService主要包含了线程的提交和线程的中断等方法。...当然通过分析我们发现ThreadPoolExecutor并没有在初始化的时候就创建核心线程,而是在逐步添加任务的时候创建的。根据我的分析和理解,我可能会尽可能少的设置核心线程。
领取专属 10元无门槛券
手把手带您无忧上云