文章目录
- 高并发-线程池2024
- 心得
- 好的博客
- 必会面试题
- 为什么使用线程池
- 线程池的实现原理
- 线程池的拒绝策略
- 阻塞队列已满,在提交任务会发生什么问题
- threadlocal原理和使用
- 多线程配置
高并发-线程池2024
心得
-
面试都是围绕着三高展开,高并发,高可用,分布式展开。
多线程属于高并发的范畴
-
好多问题在数据访问量比较小的情况下不好发生,但是数据量比较大的情况下,就要考虑更多,否则就会出问题。
-
在学习原理和底层这块,会用到很多的图例,图解,
这块最好用在线画图工具自己画出来,并把链接贴过来,或者用md来画图也可以。
好的博客
- JUC学习指南 这里主要介绍的背景,属于前言
- JUC快速入门各个知识点汇总
知识比较全面
九、线程池(重点)讲的比较好
下面是四种不同拒绝策略的使用效果
十二、死锁问题及排查
- synchronized原理分析
- JMeter详细使用教程及实际案例
必会面试题
- 多线程
- 面试题 26 . 简述 Synchronized 的原理 ?
- 面试题 42 . Java 中的线程池是如何实现 ?
- 面试题 43 . Java创建线程池的几个核心构造参数?
- 面试题 44 . 请简述Java线程池中的线程是怎么创建的?
- 面试题 86 . 请列举ThreadPoolexecutor参数配置?
- 面试题 103 . 简述Java线程池中队列常用类型有哪些 ?
- 面试题 122 . 简述乐观锁和悲观锁的理解及如何实现,有哪些实现方式?
为什么使用线程池
使用线程池的优点
减少不断创建和销毁线程的资源销耗,可以重复利用线程池中的线程
提高任务响应速度,不需要等待线程创建,就可以直接使用存在的线程
便于管理,可以统一的分配,管理和调优。
线程池的实现原理
如果线程数少于核心线程线程数,既是有线程空闲也是会创建新的线程。
如果线程数等于核心线程,那么就会把任务放到队列中。
如果线程池线程数大于或等于核心线程数,并且队列以及满了,但是线程数小于最大线程,那么就会创建新的线程来处理。
如果线程数达到了最大线程数,那么就会通过handle设置的策略来拒绝这个任务。
并且线程中的线程如果空闲时间超过了指定的空闲时间,就会被销毁,从而动态的调整线程池的数量。
线程池的拒绝策略
可以在构造器中设置线程池的拒绝策略
核心线程 最大线程 队列 首先核心线程创建,其次队列打满,才会继续创建线程,线程达到最大线程后,就会执行拒绝策略。有4种拒绝的策略
第一个 线程池满了一行,会抛出一个runtime的异常,我们可以感知到线程池已满,可以重试或放弃提交。
第二种,线程池满了,直接丢弃,不会通知,会有一定的风险
第三种,线程池满了,会丢弃线程队列中时间最长的线程,也会存在风险。
第四种,线程满了,先进行等待,等有资源了在提交新的任务。
我们也可以在方法中大于自己的日志,当线程池满了的情况下,及时处理。
阻塞队列已满,在提交任务会发生什么问题
核心线程 阻塞队列 非核心线程 执行拒绝策略
threadlocal原理和使用
这是一个线程本地存储机制,这个是一个键值对
比方存储保存用户的信息,保存连接的对象。
在线程池使用的时候,如果线程一直占用,可能会出现内存泄漏的情况发生。解决的办法是数据使用后要记得清除掉。
多线程配置
核心线程10个,其他线程根据电脑的核数,一核大概配置20个线程,队列排1000个。