京东6.18大促主会场领京享红包更优惠

 找回密码
 立即注册

QQ登录

只需一步,快速开始

为什么不推荐通过Executors直接创建线程池

2019-7-25 11:32| 发布者: zhaojun917| 查看: 718| 评论: 0|原作者: 梦想之都-俊月星空

摘要: 通过Executors的方法创建出来的线程池都实现了ExecutorSerivice接口。常用的方法有newFixedThreadPool(int Threads):创建固定数目的线程池。newSingleThreadPoolExecutor():创建一个单线程化的ExecutornewCacheThrea ...

通过Executors的方法创建出来的线程池都实现了ExecutorSerivice接口。常用的方法有

  1. newFixedThreadPool(int Threads):创建固定数目的线程池。
  2. newSingleThreadPoolExecutor():创建一个单线程化的Executor
  3. newCacheThreadPool():创建一个可缓存的线程池,调用execute将重用以前构成的线程(如果线程可用)。
  4. 如果没有可用的线程,则创建一个新线程并添加到池中。终止并从缓存中移出那些已有60秒钟未被使用的线程。
  5. newScheduledThreadPool(int corePoolSize)创建一个支持定时及周期性的任务执行的线程池,
  6. 多数情况下可用来替代Time类。

但是在阿里巴巴java开发手册中明确指出,不允许使用Executors创建线程池。

  1. public class ExecutorsDemo {
  2. private static ExecutorService executor = Executors.newFixedThreadPool(15);
  3. public static void main(String[] args) {
  4. for (int i = 0; i < Integer.MAX_VALUE; i++) {
  5. executor.execute(new SubThread());
  6. }
  7. }
  8. }
  9. class SubThread implements Runnable {
  10. @Override
  11. public void run() {
  12. try {
  13. Thread.sleep(10000);
  14. } catch (InterruptedException e) {
  15. //do nothing
  16. }
  17. }
  18. }

原因

:java中BlockingQueue主要有两种实现,分别是ArrayBlockingQueue和LinkedBlockingQueue。ArrayBlockingQueue是一个用数组实现的有界阻塞队列,必须设置容量。而LinkedBlockingQueue是一个用链表实现的有界阻塞队列,容量可以选择进行设置,不设置的话,将是一个无边界的阻塞队列,最大长度为Integer.MAX_VALUE.

查看new SingleExecutor时的源码可以发现,在创建LinkedBlockingQueue时,并未指定容量。此时,LinkedBlockingQueue就是一个无边界队列,对于一个无边界队列来说,是可以不断的向队列中加入任务的,这种情况下就有可能因为任务过多而导致内存溢出的问题。

  1. public static ExecutorService newSingleThreadExecutor() {
  2. return new FinalizableDelegatedExecutorService
  3. (new ThreadPoolExecutor(1, 1,
  4. 0L, TimeUnit.MILLISECONDS,
  5. new LinkedBlockingQueue<Runnable>()));
  6. }
  7. public static ExecutorService newCachedThreadPool() {
  8. 关闭

    站长推荐上一条 /6 下一条

    QQ|手机版|小黑屋|梦想之都-俊月星空 ( 粤ICP备18056059号 )|网站地图

    GMT+8, 2025-7-1 18:55 , Processed in 0.031201 second(s), 18 queries .

    Powered by Mxzdjyxk! X3.5

    © 2001-2025 Discuz! Team.