前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >阿里代码规约为什么不让使用Executors包装好线程池呢?

阿里代码规约为什么不让使用Executors包装好线程池呢?

作者头像
袁新栋-jeff.yuan
发布2020-08-26 18:19:52
5060
发布2020-08-26 18:19:52
举报
在Executors下主要有5个静态方法:

1. Executors.newWorkStealingPool

  • JDK8引入,创建持有足够线程的线程池支持给定的并行度,并通过使用多个队列减少竞争,此构造方法把CPU数量设置为默认的并行度
代码语言:javascript
复制
    public ForkJoinPool(int parallelism,
                        ForkJoinWorkerThreadFactory factory,
                        UncaughtExceptionHandler handler,
                        boolean asyncMode) {
        this(checkParallelism(parallelism),
             checkFactory(factory),
             handler,
             asyncMode ? FIFO_QUEUE : LIFO_QUEUE,
             "ForkJoinPool-" + nextPoolId() + "-worker-");
        checkPermission();
    }

2. Executors.newCacheThreadPool

  • 这个线程池是一个没有核心线程数的,且最大线程数是Integer.MAX_VALUE,且使用的队列是SynchronousQueue,这个队列有点反人类,他不存储元素的阻塞队列,在创建元素的时候每一个put操作必须等待take操作,否则就不能添加元素 。这样我们就知道了因为没有核心线程数,所以刚来的任务我们都会进入到队列中,但是这个队列没有take也不会put,此时那就是说队列满了,然后就创建最大线程数。且设置的最大线程数在空闲状态下的存活时间为60秒。当有线程闲下来的时候,如果有新的任务来的时候就是用空闲线程,但是有可能出现瞬间来了大量的请求,此时就会无限创建线程直到Integer.MAX_VALUE个线程,很多机器应该在没有达到之前就会OOM了。创建一个线程就会分配堆,本地方法栈,java虚拟机栈等。所以就很容易就OOM了
在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
public static ExecutorService newCachedThreadPool() {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      60L, TimeUnit.SECONDS,
                                      new SynchronousQueue<Runnable>());
    }

3. Executors.newScheduledThreadPool

  • 线程数最大到Integer.MAX_VALUE,与上面所说的一样都有可能会OOM,他是ScheduledExecutorService接口家族的实现类,支持定时及周期性任务执行。与newCacheThreadPool的区别就是不回收工作线程。从下面代码可以看出到最后也是使用了ThreadPoolExcutor这个类然定义了对应对参数。如设置了最大线程数的存活时间是0秒。
代码语言:javascript
复制
    public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
        return new ScheduledThreadPoolExecutor(corePoolSize);
    }
    
    public ScheduledThreadPoolExecutor(int corePoolSize) {
        super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
              new DelayedWorkQueue());
    }
        public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue) {
        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
             Executors.defaultThreadFactory(), defaultHandler);
    }

4. Executors.newSingleThreadExecutor

  • 创建一个单线程的的线程池,相当于单线程串行执行任务,保证按任务的提交顺序依次执行。这个线程池虽然不会因为线程创建过多而oom但是会因为阻塞到队列而最后产生oom,因为他使用的是LinkedBlockingQueue 看源码我们可知他的最大长度也是Integer.MAX_VALUE,所以大量任務的提交也会导致OOM。
在这里插入图片描述
在这里插入图片描述

源码:

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

5. Executors.newFixedThreadPool

  • 输入的参数即是固定的线程数,即是核心的线程数也是最大的线程数,不存在空闲线程
  • 看下面的源码我们可知最大线程数和核心线程数是相等的,也就可说只有核心线程数,我们都知道如果核心线程数没有特定的配置的话核心线程数一旦创建就不会被回收的。但是我们可以看到他使用的也是LinkedBlockingQueue且默认的大小为Integer.MAX_VALUE,所以也会OOM。
代码语言:javascript
复制
    public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
    }

其实看了上面的Excutors的五个方法后,在阿里规约里面时不可以使用除第一个外的四个包内线程的,因为他们都会引起OOM。

从源码我们可以看出都是有ThreadPoolExcutor这个类传入不同的参数而实现的所以说只要我们搞懂其中传入的7个参数的含义,就可以大概搞懂线程池的冰山一角了

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-05-05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 在Executors下主要有5个静态方法:
  • 其实看了上面的Excutors的五个方法后,在阿里规约里面时不可以使用除第一个外的四个包内线程的,因为他们都会引起OOM。
  • 从源码我们可以看出都是有ThreadPoolExcutor这个类传入不同的参数而实现的所以说只要我们搞懂其中传入的7个参数的含义,就可以大概搞懂线程池的冰山一角了
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档