首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java陷阱之:线程池不允许使用 Executors 去创建

Java陷阱之:线程池不允许使用 Executors 去创建

作者头像
崔认知
发布2023-06-19 14:28:59
发布2023-06-19 14:28:59
4050
举报
文章被收录于专栏:nobodynobody


规则

线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,合理设置7大参数。

这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。

线程池不允许使用 Executors 去创建的原因


  • java.util.concurrent.Executors#newFixedThreadPool(...)解析
代码语言:javascript
复制
public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
    }
代码语言:javascript
复制
public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>(),
                                      threadFactory);
    }

‍线程池的大小是有界的,即线程个数可以控制,但是,等待队列是无界的,等待队列没有容量限制,任务就有可能堆积,一直把内存占满,发生OOM。

  • java.util.concurrent.Executors#newCachedThreadPool(...)解析
代码语言:javascript
复制
public static ExecutorService newCachedThreadPool() {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      60L, TimeUnit.SECONDS,
      
代码语言:javascript
复制
public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory) {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      60L, TimeUnit.SECONDS,
                                      new SynchronousQueue<Runnable>(),
                                      threadFactory);
    }

线程池中线程的数目是不受限制的,如果业务运行时间比较长,一直不释放持有的线程,导致线程数目暴增,会发生OOM。

java.util.concurrent.Executors#newSingleThreadExecutor(...) 解析

代码语言:javascript
复制
public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue<Runnable>()));
    }
代码语言:javascript
复制
public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory) {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue<Runnable>(),
                                    threadFactory));
    }

线程池中线程数目为1,但是等待队列也是无容量限制的

总结


线程池不允许使用 Executors 去创建,因为创建的线程池很容易导致OOM的发生,我们还是显示的通过ThreadPoolExecutor创建,合理设置7大参数。

jdk源码版本:

代码语言:javascript
复制
java version "17.0.2" 2022-01-18 LTS
Java(TM) SE Runtime Environment (build 17.0.2+8-LTS-86)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.2+8-LTS-86, mixed mode, sharing)
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 认知科技技术团队 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档