决战圣地玛丽乔亚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()含义?

posted @   NobodyHero  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!
点击右上角即可分享
微信分享提示