随着项目的复杂度越来越高,很多地方都会用到多线程。而在多线程领域呢,我们经常使用的就是线程池啦。一提到线程池,小伙伴们兴高采烈的说,不就是调用那几个jdk自带的方法吗,so easy。那你就大错特错啦,如果你平时都是这么用的话,那么你一定没有阅读源码的好习惯,那推荐的用法是什么呢?那下面就来详细的说说吧。
大家看过源码都知道,jdk自带的这四个方法,底层使用的是LinkedBlockingQueue,虽然设置了最大线程数,但是设置的值为Integer.MAX_VALUE,这个数字是相当可怕的,也就相当于是无界队列,当请求比较多时,容易堆积在阻塞队列中,引发OOM。这个是最根本的原因,当然了,阿里巴巴编码规范中也明确的规定了不要使用jdk自带的这四个方法。而推荐的做法是使用ThreadPoolExecutor的构造方法,就是下面这个啦:
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
我们来详细看一下这几个参数:
知道这几个参数的含义当然是不够的了,我们在使用的时候主要关心的是最大线程数,那具体怎么来设置最大线程数呢?这个就跟你们的机器有关啦,在java代码中获取机器核心数的代码是
Runtime.getRuntime().availableProcessors();
通过这行代码,我们就可以知道当前项目运行的机器的核心是多少啦。接下来我们要讨论如何设置啦。首先我们要分两种情况,即CPU密集型和IO密集型任务。
原文作者:毛毛小妖的笔记;如有侵权,请联系管理员删除。