1. 线程池的排队策略
A. 直接移交:队列的存储空间为0,例如SynchronousQueue。当把这种队列传给线程池之后,任务只能交给线程执行,不能存储在队列中。可以认为SynchronousQueue是一个刚创建出来就是满的阻塞队列并且永远都是满的。假如线程池中的线程个数未达到最大值,则每次往线程池提交任务,则它要么被空闲worker线程取出执行,要么被新创建的worker线程取出来执行。
B. 无界队列:队列的存储空间无限(不考虑内存空间),例如LinkedBlockingQueue。使用这种队列的线程池,worker线程的个数达到corePoolSize之后不再增加,新的任务全部都存入队列,所以maximumPoolSize参数不会产生实质性的作用。这种队列适合任务之间无依赖关系的场景,也可以用于对突然增长的高并发请求进行平滑处理或削峰。
C. 有界队列:有空间大小限制的阻塞队列,例如ArrayBlockingQueue。使用这种队列的时候,队列大小及maximumPoolSize这两个参数是比较难调整的。你可以多观察CPU利用率、线程上下文切换消耗、吞吐量等指标,结合任务类型(是否容易阻塞)等来调整这两个参数。假如任务的IO操作较多,那么系统就有较多空余时间执行上下文切换,此时可以适当增加maximumPoolSize让线程多一些;如果任务计算量较多,则可以适当增大队列、减少线程数,腾出上下文切换时间给任务。一般而言,调小队列大小之后就应该调大一些maximumPoolSize,反之亦然。
2. 线程池的饱和处理策略
当线程池已关闭或者达到饱和状态(队列和线程数均达到上限)时,再有线程提交任务,就会触发饱和处理策略。有4种策略:
- ThreadPoolExecutor.AbortPolicy(放弃执行,提交的线程一调用submit()就会接收到RejectedExecutionException异常);
最后
为什么我不完全主张自学?
①平台上的大牛基本上都有很多年的工作经验了,你有没有想过之前行业的门槛是什么样的,现在行业门槛是什么样的?以前企业对于程序员能力要求没有这么高,甚至十多年前你只要会写个“Hello World”,你都可以入门这个行业,所以以前要入门是完全可以入门的。
②现在也有一些优秀的年轻大牛,他们或许也是自学成才,但是他们一定是具备优秀的学习能力,优秀的自我管理能力(时间管理,静心坚持等方面)以及善于发现问题并总结问题。
如果说你认为你的目标十分明确,能做到第②点所说的几个点,以目前的市场来看,你才真正的适合去自学。
除此之外,对于绝大部分人来说,报班一定是最好的一种快速成长的方式。但是有个问题,现在市场上的培训机构质量参差不齐,如果你没有找准一个好的培训班,完全是浪费精力,时间以及金钱,这个需要自己去甄别选择。
我个人建议线上比线下的性价比更高,线下培训价格基本上没2W是下不来的,线上教育现在比较成熟了,此次疫情期间,学生基本上都感受过线上的学习模式。相比线下而言,线上的优势以我的了解主要是以下几个方面:
①价格:线上的价格基本上是线下的一半;
②老师:相对而言线上教育的师资力量比线下更强大也更加丰富,资源更好协调;
③时间:学习时间相对而言更自由,不用裸辞学习,适合边学边工作,降低生活压力;
④课程:从课程内容来说,确实要比线下讲的更加深入。
应该学哪些技术才能达到企业的要求?(下图总结)
加入社区:https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0
https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0