[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 操作,清空队列并终止。
1.循环队列的出现 (1)上面的这个就是一个普通的数据的入队和出队的过程我们正常情况下去实现这个入队和出队的过程,就是这个数据从这个队尾进入,从队头离开,但是这个加入的时候肯定是没有其他的问题的,直接在这个队尾插入数据就可以了...1之后和这个队列里面的元素的个数取模,等于0,这个时候就相当于这个最后一个下标之后就是第一个下标,以此来实现这个循环队列; (3)队列是空的临界条件: 我们假设这个时候的队列里面只有一个数据,指针的指向情况如图所示...指针,数据出队,我们需要移动这个front指针,两个最后的效果是一样的,但是中间经历的过程不是一样的; (5) (6)循环队列实现入队和出队 我们之前的这个思路完全不变,只不过这个循环之后,原来这个入队就是把这个...3)具体举例说明 这个事件链表和这个队列数组之间有什么关系?...,两者之间的数据是相互辅助的; 由于这个算法的综合性比较强,因此学有余力的同学可以自行学习,刚开始学习栈和队列的同学不建议上手,因为这个里面涉及到链表,和这个队列数组,综合性较强,需要把这些铺垫知识学好再去学习
标准库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上下文的切换(会把上一次的记录保存)。
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,并制定队列的最大长度)有助于防止资源耗尽,但是可能较难调整和控制,队列大小和最大池大小需要相互折衷
ThreadPoolExecutor使用 Executor框架最核心的类就是ThreadPoolExecutor,它是线程池的实现类。...workQueue参数指定,如果入队失败(队列已满)则尝试创建临时线程,但临时线程和核心线程的总数不能超过maximumPoolSize,当线程总数达到maximumPoolSize后会拒绝新任务;所以有两种方式可以让任务绝不被拒绝...ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程) ThreadPoolExecutor.CallerRunsPolicy...FixedThreadPool和SingleThreadExecutor使用无界队列LinkBlockingQueue作为线程池的工作队列。...极端情况下,CachedThreadPool会因为创建过多线程而耗尽CPU和内存资源。 ?
ThreadPoolExecutor也就是线程池。它就是Java为我们开发多线程程序时提供的一个开发框架。...线程池的创建:在创建ThreadPoolExecutor时,会需要传递几个必要的参数,下面我们详细看一下它们每个参数所代表的含义。...TimeUnit(线程活动保持时间的单位):可选的单位有天(DAYS)、小时(HOURS)、分钟(MINUTES)、毫秒(MILLISECONDS)、微秒(MICROSECONDS,千分之一毫秒)和纳秒...下面我们用具体的代码来详细说明一下ThreadPoolExecutor的使用。 ? ?...按照上面的分析,因为我们创建ThreadPoolExecutor对象时初始化的空闲线程是2个,并且我们添加到线程池中的数量也是2个,所以当前任务是由核心线程池执行的任务并不会将任务添加到对列中。
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元无门槛券
手把手带您无忧上云