线程池的原理,运行顺序,java队列原理,几个方法有啥区别(arrayblockingqueue和linkednlockqueue,首尾,锁,多少个锁)
线程池的错误怎么排查(阿里规范里有,不能用原生的ThreadPoolExecutor,要重写线程池,过程和几个重要的点)
- 如果不使用线程池,有可能造成系统创建大量同类线程而导致消耗完内存或者“过度切换”的问题。
线程池的优势:
- 线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。
- 线程池不仅能够保证内核的充分利用,还能防止过分调度。
- 可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络sockets等的数量。
阿里巴巴规范:
-
线程池不允许使用Executors创建,而是通过ThreadPoolExecutor的方式,这样可以明确的运行规则,规避资源耗尽的风险
-
newFixedThreadPool和newSingleThreadExecutor 的弊端:
都是无界队列,允许的队列长度都是Integer.MAX_VALUE, 请求可能大量堆积,最后造成JVM的OOM内存溢出
- newCachedThreadPool 的弊端:
允许的创建线程数量为Integer.MAX_VALUE, 可能创建出大量线程,最后造成JVM的OOM内存溢出