决战圣地玛丽乔亚Day34----线程池相关
线程池的拒绝策略:
• CallerRunsPolicy - 当触发拒绝策略,只要线程池没有关闭的话,则使用调用线程直接运行任务。一般并发比较小,性能要求不高,不允许失败。但是,由于调用者自己运行任务,如果任务提交速度过快,可能导致程序阻塞,性能效率上必然的损失较大
• AbortPolicy - 丢弃任务,并抛出拒绝执行 RejectedExecutionException 异常信息。线程池默认的拒绝策略。必须处理好抛出的异常,否则会打断当前的执行流程,影响后续的任务执行。
• DiscardPolicy - 直接丢弃,其他啥都没有
• DiscardOldestPolicy - 当触发拒绝策略,只要线程池没有关闭的话,丢弃阻塞队列 workQueue 中最老的一个任务,并将新任务加入
几个核心参数含义?
corePoolSize=10;线程池的基本大小,即在没有任务需要执行时候的线程池大小,并且只有在Workqueue满了的情况下才会创建超出这个数量的线程。
maximumPoolSize=20;池中允许的最大线程数,线程池的当前线程数不会超过该值,如果队列中的任务满了,并且当前线程数小于maximum,那么会创建新的线程执行任务
KeepAliveTime=3;空闲线程保持在线程池中的时间,超过这个时间会因为超时退出。
unit(TimeUnit枚举类):时间单位
workQueue(BlockingQueue):任务队列,线程任务提交到线程池后,首先放入队列中,然后线程池按照该任务队列依次执行相应任务。
threadFactory(ThreadFactory类):新线程产生工厂类
handler(RejectExcutionHandler类):当前提交线程拒绝执行、异常的时候,处理异常的类。
ThreadPoolExecutor.AbortPolicy: 丢弃任务并抛出RejectedExecutionException 异常。
ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。
ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务,重复此过程。
ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务。
当提交任务数大于 corePoolSize 的时候,会优先将任务放到 workQueue 阻塞队列中。当阻塞队列饱和后,会扩充线程池中线程数,直到达到 maximumPoolSize 最大线程数配置。此时,再多余的任务,则会触发线程池的拒绝策略了。
线程完成任务,会从队列取下一个任务执行。当一个线程空闲超过KeepAliveTime时,会判断线程池大小是否大于CorePoolSize,如果大于多余的空闲线程会被停掉,知道收缩到corePoolSize大小。
阻塞队列有哪些?
ArrayBlockingQueue
基于数组的有界阻塞,大小创建时固定。先进先出排序。可以选公平OR非公平
存取一把锁,吞吐不理想。
LinkedBlockingQueue
基于链表的阻塞队列,先进先出排序。
默认和最大长度为 Integer.MAX_VALUE相当于无界
存取两把锁,并行处理存取,性能比ArrayBlockingQueue强。。
SynchronousQueue
不存储元素的阻塞队列,负责传递数据。也就是说,插入一个数据进去,如果没有另外线程调用移出操作,就会一直阻塞。put必须等一个take
性能比ArrayBlockingQueue和LinkedBlockingQueue强
PriorityBlockQueue
具有优先级的无界阻塞队列。可以实现Comparable接口,也可以提供Comparator来对队列元素进行比较
无界阻塞队列:
如果任务的处理时间长,大量新任务堆积在任务队列,可以会导致直到耗尽系统内存OOM
有界阻塞队列:
防止资源耗尽。
线程池小,有界队列大,可以减少内存消耗,降低cpu使用率和上下文切换,不过会限制吞吐量。
核心线程如何回收?
超过最大线程数会怎样?
为什么要有阻塞队列?
为什么避免用Executors静态线程池?
调优
大量RPC调用怎么调?
大量计算任务怎么调?
线程生命周期有哪些?
几个状态的转换?
Thread.yield()含义?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!