首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java并发——一文吃透线程

线程状态是STOP,TIDYING,TERMINATED 线程状态是SHUTDOWN,并且传入了任务不是null(SHUTDOWN状态下,线程池不再接受任务) 当前线程数>=允许最大线程数...3.5 Worker工作过程 Worker工作流程.drawio.png Woker执行任务有2个来源 Woker创建时指定firstTask 从阻塞队列获取 Woker分为阻塞 核心线程和 非核心线程...()尝试销毁线程池 第4步大部分情况都不会成功 线程池状态变为SHUTDOWN后,线程池不会再接受任务,但已经接受任务仍会继续执行,当所有任务执行完后,线程检测到线程池状态为SHUTDOWN并且任务队列空了...将线程状态修改为 STOP 对线程池中所有线程调用interrupt()传递中断信号 移出任务队列中所有未执行任务 调用tryTerminal()尝试销毁线程池 shutdownNow()移除任务队列中所有未执行任务...3.8.2 为什么任务先放在任务队列中,而不是直接把线程数目拉到最大个人理解 我认为线程本意是让核心数量线程工作着,任务队列起到一个缓冲作用,最大线程数目这个参数更像是无奈之举,在任务非常多情况下做最后努力

29600

面试官:一个Spring Boot项目能同时处理多少个请求

而点击这些线程,查看堆栈消息,可以看到 Tomcat、threads、ThreadPoolExecutor 等关键字: at org.apache.Tomcat.util.net.NioEndpoint...在心里又默念了一次:当线程接受到任务之后,先启用核心线程数,再使用队列长度,最后启用最大线程数。...目前,已知是核心线程数,值为 10。这 10 个线程工作流程是符合我们认知。但是第 11 个任务过来时候,本应该进入队列去排队。现在看起来,是直接启用最大线程数了。...如果当前线程线程线程池配置最大线程数还少,则返回 false。前面说了,offer 方法返回 false,会出现什么情况?...Tomcat 默认核心线程数是 10,最大线程数 200,队列长度是无限长。但是由于运行机制和 JDK 线程池不一样,在核心线程数满了之后,会直接启用最大线程数。

69740
您找到你想要的搜索结果了吗?
是的
没有找到

写给小白看线程池,还有10道面试题

为什么要用线程池呢?...另外:线程平均工作时间所占比例越高,就需要越少线程线程平均等待时间所占比例越高,就需要越多线程; 以上只是理论值,实际项目中建议在本地或者测试环境进行多次调优,找到相对理想值大小。...面试题7:线程为什么需要使用(阻塞)队列? 主要有三点: 因为线程若是无限制创建,可能会导致内存占用过多而产生OOM,并且会造成cpu过度切换。 创建线程消耗较高。...面试题8:线程为什么要使用阻塞队列而不使用非阻塞队列? 阻塞队列可以保证任务队列中没有任务时阻塞获取任务线程,使得线程进入wait状态,释放cpu资源。...在线程池中,同一个线程可以从阻塞队列中不断获取新任务来执行,核心原理在于线程池对 Thread 进行了封装,并不是每次执行任务都会调用 Thread.start() 来创建新线程,而是让每个线程去执行一个

34320

ThreadPoolExecutor线程池主要参数你都知道吗?

如果在运行线程数数量超过核心线程数但是小于最大线程数,并且工作队列已满,将创建一个线程处理这个请求。...总是倾向于添加一个新线程而不是排队 如果核心线程数或更多线程正在运行(不超过最大线程数),Executor总是倾向于排队请求,而不是添加一个新线程 如果没有达到最大线程数并且队列未满,将创建新线程执行任务...例如,在web服务器中,这种队列在消除短暂高并发方面很有作用,它允许无界队列增长平均速度处理平均速度快。...队列大小和最大线程可以互相替换:使用更大队列数量和小线程池数量能够最小化CPU使用、系统资源和上下文切换开销,但也人为导致了低吞吐量。...如果一个任务频繁阻塞,例如频繁I/O,系统更多时间是在频繁调度而不是运行任务。使用小队列通常需要大线程池数量,这会让CPU更能充分利用,但是也会遇到不可接受调度开销,也会降低吞吐量。

45410

面试官:一个 SpringBoot 项目能处理多少请求?(小心有坑)

但是你一点也不慌,再次结合你背滚瓜烂熟、非常扎实线程池知识。 并在心里又默念了一次:当线程接受到任务之后,先启用核心线程数,再使用队列长度,最后启用最大线程数。...目前已知是核心线程数,值为 10。这 10 个线程工作流程是符合我们认知。 但是第 11 个任务过来时候,本应该进入队列去排队。 现在看起来,是直接启用最大线程数了。...如果当前线程线程线程池配置最大线程数还少,则返回 false。 前面说了,offer 方法返回 false,会出现什么情况?...Tomcat 默认核心线程数是 10,最大线程数 200,队列长度是无限长。但是由于运行机制和 JDK 线程池不一样,在核心线程数满了之后,会直接启用最大线程数。...为什么在前面的分析过程中我们并没有注意到这个参数呢? 首先我们看一下它默认值: 因为它默认值是 8192,最大线程数 200 大,这个参数并没有限制到我们,所以我们没有关注到它。

44210

面试官:一个 SpringBoot 项目能处理多少请求?|技术创作特训营第一期

但是你一点也不慌,再次结合你背滚瓜烂熟、非常扎实线程池知识。并在心里又默念了一次:当线程接受到任务之后,先启用核心线程数,再使用队列长度,最后启用最大线程数。...这 10 个线程工作流程是符合我们认知。但是第 11 个任务过来时候,本应该进入队列去排队。现在看起来,是直接启用最大线程数了。...Tomcat 线程池,就是先使用核心线程数配置,再使用最大线程配置,最后才使用队列长度。所以,以后当面试官给你说:我们聊聊线程工作机制吧?...Tomcat 默认核心线程数是 10,最大线程数 200,队列长度是无限长。但是由于运行机制和 JDK 线程池不一样,在核心线程数满了之后,会直接启用最大线程数。...为什么在前面的分析过程中我们并没有注意到这个参数呢?首先我们看一下它默认值:因为它默认值是 8192,最大线程数 200 大,这个参数并没有限制到我们,所以我们没有关注到它。

24000

线程ThreadPoolExecutor 原理及源码笔记

前言 " 前面在学习 JUC 源码时,很多代码举例中都使用了线程ThreadPoolExecutor ,并且在工作中也经常用到线程池,所以现在就一步一步看看,线程源码,了解背后核心原理。...—— 维基百科 为什么要使用线程池 降低资源消耗:通过池化技术重复利用已创建线程,降低线程创建和销毁造成损耗。 提高响应速度:任务到达时,无需等待线程创建即可立即执行。...handler线程拒绝策略: 当线程池达到最大线程数,并且队列满了,新线程要采取处理策略。 AbortPolicy 拒绝新任务并抛出RejectedExecutionException异常。...创建工作线程 Worker ,并使用独占锁,将其添加到线程池,并启动。 3 总结 Q&A Q: 线程原理及相关参数? A: 主要参数为核心线程数、阻塞队列最大线程数、拒绝策略。...结束语 通过阅读 ThreadPoolExecutor 了解线程基本结构和原理,至于其他更多扩展,文章篇幅有限,就需要小伙伴们自己阅读了。 - -

41130

当面试官问线程池时,你应该知道些什么?

概述 什么是线程池? 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。 为什么要用线程池?...Executor:一个接口,定义了一个接收 Runnable 对象方法 executor,方法签名为 executor(Runnable command), ExecutorService:是一个...maximumPoolSize:线程池允许创建最大线程数。如果队列满了,并且已创建线程数小于最大线程数,则线程池会再创建新线程执行任务。...每当提交一个任务就创建一个工作线程,如果工作线程数量达到线程池初始最大数,则将提交任务存入到池队列中。...如果这个线程异常结束,会有另一个取代它,保证顺序执行。单工作线程最大特点是可保证顺序地执行各个任务,并且在任意给定时间不会有多个线程是活动

35430

ThreadPoolExecutor线程池解析及Executor创建线程常见四种方式

而使用线程可以有效控制最大并发线程数,提高系统资源利用率,同时避免过多资源竞争,避免阻塞 同时new Thread,当我们需要定期执行,更多执行,线程中断等等使用Thread操作起来非常繁琐。...,在核心线程都繁忙时候会使新提交任务在队列中等待被执行,所以将不会创建更多线程,这时候,maximunPoolSize最大线程值将不起作用。...RUNNING:在这个状态线程池能判断接受新提交任务,并且也能处理阻塞队列任务 SHUTDOWN:处于关闭状态,该线程池不能接受新提交任务,但是可以处理阻塞队列中已经保存任务,在线程处于RUNNING...当线程处于RUNNING和SHUTDOWN状态,调用shutdownNow()方法就可以使线程变为该状态 TIDYING:在SHUTDOWN状态下阻塞队列为空,且线程工作线程数量为0就会进入该状态,...:创建是定长线程池,可以控制线程最大并发数,超出线程会在线程中等待,使用是无界队列,核心线程数和最大线程数一样,当线程池中线程没有任务时候立刻销毁,使用默认线程工厂。

2.8K40

三万字总结最全Java线程ThreadPoolExecutor源码面试题

绿色框采用自定义线程工厂,明显蓝色框默认线程工厂创建线程名称拥有更多额外信息:如调用来源、线程业务含义,有助于快速定位到死锁、StackOverflowError 等问题....目的是 在实现多重循环时能够快速退出到任何一层; 出发点似乎非常贴心,但在大型软件项目中,滥用标签行跳转后果将是灾难性....源码分析 /** * 检查是否可以根据当前池状态和给定边界(核心或最大) * 添加新工作线程。...如果是这样,工作线程数量会相应调整,如果可能的话,一个新工作线程创建并启动 * 将firstTask作为运行第一项任务。...I/O密集型任务 执行较慢、数量不大IO任务,要考虑更多线程数,而无需太大队列

29520

Java源码解析 - ThreadPoolExecutor 线程

(),线程池会提前创建并启动所有核心线程 2.1.2 maximumPoolSize(线程最大线程数) 线程池允许创建最大线程数 若队列满,并且已创建线程数小于最大线程数,则线程池会再创建新线程放入...绿色框采用自定义线程工厂,明显蓝色框默认线程工厂创建线程名称拥有更多额外信息:如调用来源、线程业务含义,有助于快速定位到死锁、StackOverflowError 等问题....目的是 在实现多重循环时能够快速退出到任何一层; 出发点似乎非常贴心,但在大型软件项目中,滥用标签行跳转后果将是灾难性....(核心或最大) * 添加新工作线程。...如果是这样,工作线程数量会相应调整,如果可能的话,一个新工作线程创建并启动 * 将firstTask作为运行第一项任务。

57330

【Java 基础篇】ThreadPoolExecutor 详解

线程池是一组维护着多个线程池子,这些线程可以被反复使用,以执行异步任务。线程主要目的是为了管理线程生命周期,降低线程创建和销毁开销,提高应用程序性能和稳定性。 2. 为什么需要线程池?...SHUTDOWN:线程池处于关闭状态,不再接受新任务,但会继续处理已有任务,直到任务队列为空。 STOP:线程池立即停止,正在执行任务会被中断,尚未执行任务会被移出队列。...工作流程 ThreadPoolExecutor 工作流程可以简单地描述如下: 当线程池接收到一个新任务时,首先检查核心线程是否已满,如果未满,则创建一个新核心线程来执行该任务。...创建 ThreadPoolExecutor 要创建一个 ThreadPoolExecutor,需要调用构造方法并传递相应参数。...关闭线程池后,将不再接受新任务,但会继续执行已有任务,直到任务队列为空。

47340

面试官:说说线程工作原理?

线程底层是基于线程和任务队列来实现,创建线程创建方式通常有以下两种:普通 Java 项目,使用 ThreadPoolExecutor 来创建线程池,这点《阿里巴巴Java开发手册》中也有说明,...如下图所示:Spring 项目中,会使用代码可读性更高 ThreadPoolTaskExecutor 来创建线程池,虽然它底层也是通过 ThreadPoolExecutor 来实现,但 ThreadPoolTaskExecutor...()); // 初始化 executor.initialize(); return executor; }}1.线程工作流程当有任务来了之后,线程执行流程是这样...如果任务队列已满,则判断当前线程数量是否超过最大线程数,如果结果为 false,则新建线程执行此任务。如果超过最大线程数,则将执行线程拒绝策略。...为什么线程池是通过什么机制来创建线程线程池创建线程可以设置哪些属性?

8410

并发编程之线程池原理

点击上方疾风先生可以订阅哦 线程池作用 使用背景 在并发大量异步任务处理程序中,每执行一个任务就需要创建一个线程,同时任务执行完毕之后需要将线程销毁.我们知道JVM创建线程时候需要为分配线程栈空间以及一些初始化操作...其次,通过线程池我们可以控制线程数量,可以根据指定策略来管理线程,比如任务过多,线程处理不过来,可以分配新线程,当线程数量达到上限时,可以自定义策略管理任务,要么是放入阻塞队列中等待线程消费完成再继续...ThreadPoolExecutor类下核心组件 1) 工作线程Worker:包装一个线程以及任务工作线程,在没有任务时候处于等待,可以循环任务,并且实现AQS接口,从类图中可以看出具备独占锁功能...构造方法参数说明 1) corePoolSize: 线程池保持活跃线程数 2) maximumPoolSize: 线程池可创建最大线程数,如果队列为无界队列,则该设置值没有效果 3) keepAliveTime...你好,我是疾风先生,先后从事外企和互联网大厂java和python工作, 记录并分享个人技术栈,欢迎关注我公众号,致力于做一个有深度,有广度,有故事工程师,欢迎成长路上有你陪伴,关注后回复greek

42340

理解Java并发工具包线程设计

创建线程流程依赖底层操作系统,不同操作系统可能不一样,此外更多线程意味着 OS调度需要做更多工作来决定哪一个线程可以访问资源,并且要通过OS调度切换维护线程各种状态。...=new AbortPolicy() //队列满了,直接抛出异常 (6)ForkJoinPool基于工作窃取算法( work-stealing)线程池 这个线程池其实是ThreadPoolExecutor...那么,为什么需要使用工作窃取算法呢?...不接受新任务 , 但是处理队列里面的任务 (3)STOP 不接受新任务,不处理队列任务,并且打断正在运行任务 (4)TIDYING 所有的任务已经终止,workerCount是0,此时线程状态切为...关于队列维护: ThreadPoolExecutor类提供了一个getQueue()方法,允许访问当前工作队列去监控和调试,此外 这个类还有两个方法:remove(Runnable) 和 purge

69520

ThreadPoolExecutor 线程池配置 和 阻塞队列BlockingQueue

可以使用此队列与池大小进行交互: 排队有三种通用策略 被拒绝任务 当 Executor 已经关闭,并且 Executor 将有限边界用于最大线程工作队列容量,且已经饱和时,在方法execute(...ThreadPoolExecutor是一个灵活健壮池实现,允许各种各样用户定制。 线程创建与销毁 核心池大小、最大池大小和存活时间共同管理着线程创建与销毁。...核心池大小是目标的大小;线程实现试图维护池大小;即使没有任务执行,池大小也等于核心池大小,并直到工作队列充满前,池都不会创建更多线程。...对于庞大或无限池,可以使用SynchronousQueue,完全绕开队列,直接将任务由生产者交给工作线程。...解耦 在项目启动之初来预测将来项目会碰到什么需求,是极其困难

2K20

(78) 线程池 计算机程序思维逻辑

线程池主要由两个概念组成,一个是任务队列,另一个是工作线程工作线程主体就是一个循环,循环从队列接受任务并执行,任务队列保存待执行任务。...表示线程池中最多线程数,线程个数会动态变化,但这是最大值,不管有多少任务,都不会创建这个值大线程个数。...,比如: LinkedBlockingQueue:基于链表阻塞队列可以指定最大长度,但默认是无界。...executor); } 当线程池不能接受任务时,调用拒绝策略rejectedExecution方法。...对于普通队列,入队只是把任务放到了队列中,而对于SynchronousQueue来说,入队成功就意味着已有线程接受处理,如果入队失败,可以创建更多线程直到maximumPoolSize,如果达到了maximumPoolSize

64370

Juc并发编程12——2万字深入源码:线程池这篇真的讲解透透

线程池一般具有容量限制,如果所有的线程都处于工作状态,在接受到新线程请求时,将会进入阻塞状态,直到有可用空闲线程,实际上就是使用阻塞队列处理。...I/O密集型:主要是执行I/O操作任务,比如从硬盘中读取数据,因为I/O速度cpu要慢很多,这种类型任务cpu空间时间较多,可以设置最大同时运行线程数=cpu核心数*2,让更多线程执行I/O,...,核心线程数是0,最大线程数是Integer.MAX_VALUE,空闲等待时间是60s,等待队列没有容量。...由于最大线程数几乎可以让你想创建多少线程就创建多少线程,并且空闲线程等待时间是很长,有60s,因此可能存在许多隐患,建议谨慎使用。...可以发现最大容量都是Integer.MAX_VALUE,并且使用等待队列都是DelayedWorkQueue,是不是有种恍然大悟感觉。

12120

Java 线程ThreadPoolExecutor原理及源码全面解析(基于JDK8)

绿色框采用自定义线程工厂,明显蓝色框默认线程工厂创建线程名称拥有更多额外信息:如调用来源、线程业务含义,有助于快速定位到死锁、StackOverflowError 等问题. 5 创建线程池...目的是 在实现多重循环时能够快速退出到任何一层; 出发点似乎非常贴心,但在大型软件项目中,滥用标签行跳转后果将是灾难性....,且工作队列没满,则将新提交任务存储在工作队列里。...源码分析 /** * 检查是否可以根据当前池状态和给定边界(核心或最大) * 添加新工作线程。...如果是这样,工作线程数量会相应调整,如果可能的话,一个新工作线程创建并启动 * 将firstTask作为运行第一项任务。

1.6K42

Java多线程探索(二):优秀ThreadPoolExecutor到底是如何工作

人生苦短,不如养狗 一、前言   在上一篇Java多线程探索(一):为什么要使用ThreadPoolExecutor?中我们简单介绍了为什么推荐使用ThreadPoolExecutor原因。...以下是线程池五种状态流转关系图,也就是线程生命周期: RUNNING:此时线程池能够接受任务,并且能够处理阻塞队列任务。...SHUTDOWN:此时线程池不接受任务,只处理阻塞队列任务。STOP:此时线程池既不接受任务,也不接受阻塞队列任务。...而通过实现Runnable接口,Worker又能像线程一样进行工作,作为线程池中任务运行基本单位。这也就是为什么在它构造方法中,能够通过指定线程工厂和this对象创建对应工作线程。   ...而如果当前线程是空闲状态,也就是无锁状态,那么就可以进行中断。   再来看下Worker不可重入,其实还是为了保证运行中线程不会被中断。

38230
领券