一.了解什么是池化技术
https://blog.csdn.net/wmdkanh/article/details/105442208
https://blog.csdn.net/weixin_30768661/article/details/98005333
https://blog.csdn.net/winter199/article/details/105818195
二.深入分析线程池的意义
https://www.cnblogs.com/kaffeetrinken/p/8548549.html
https://blog.csdn.net/qq_38729449/article/details/79452898
https://blog.51cto.com/9527824/2435706
三.java中提供的线程池
https://www.cnblogs.com/zsh-blogs/p/11255527.html
https://www.cnblogs.com/amunote/p/10322294.html
https://blog.csdn.net/weixin_36759405/article/details/82825634
四.思考线程池的设计哲学
五.阻塞队列在线程池中的应用
https://www.jianshu.com/p/8dcc81abde4d
六.线程池的实现原理分析
https://www.cnblogs.com/yujian0817/p/12703883.html
https://www.cnblogs.com/qlsem/p/11498970.html
https://www.cnblogs.com/flgb/p/13062798.html
https://blog.csdn.net/programmer_at/article/details/79799267
七.线程池的使用注意事项
https://www.cnblogs.com/lijiasnong/p/9963242.html
https://blog.csdn.net/Moment_007/article/details/106455822
https://blog.csdn.net/weixin_30472035/article/details/97199334
https://www.cnblogs.com/ltstar/p/12691125.html
虽然线程池能大大提高服务器的并发性能,但使用它也会存在一定风险。与所有多线程应用程序一样,用线程池构建的应用程序容易产生各种并发问题,如对共享资源的竞争和死锁。此外,如果线程池本身的实现不健壮,或者没有合理地使用线程池,还容易导致与线程池有关的死锁、系统资源不足和线程泄漏等问题。
1) 建议使用new ThreadPoolExecutor(…)的方式创建线程池
线程池的创建不应使用
Executors 去创建,而应该通过 ThreadPoolExecutor
创建,这样可以让读者更加明确地知道线程池的参数设置、运行规则,规避资源耗尽的风险,这一点在也阿里巴巴JAVA开发手册中也有明确要求。这一点不容小觑,曾有同学因为线程池使用不当导致生产的同一台机器上部署的多个应用都因无法创建线程池而出现故障。
2) 合理设置线程数
线程池的工作线程数设置应根据实际情况配置,CPU密集型业务(搜索、排序等)CPU空闲时间较少,线程数不能设置太多。
如果是CPU密集型任务,就需要尽量压榨CPU,参考值可以设为 NCPU+1
如果是IO密集型任务,参考值可以设置为2*NCPU
3) 设置能代表具体业务的线程名称
这样方便通过日志的线程名称识别所属业务。具体实现可以通过指定ThreadPoolExecutor的ThreadFactory参数。如使Spring提供的CustomizableThreadFactory。
以上就是Java线程池的详细介绍,除了从编程的角度应对高并发,更多还需要从架构设计的层面来应对高并发场景,例如:Redis缓存、MySQL数据库的优化、异步消息等