zoukankan      html  css  js  c++  java
  • 面试题之使用无界队列的线程池会导致内存飙升吗?

    答案:会;

    分析:

    创建线程池方式有如下几种:

    Executors.newFixedThreadPool(10);//LinkedBlockingQueue 无限加入队列
    Executors.newScheduledThreadPool(10);//DelayedWorkQueue 队列如果满了,阻塞
    Executors.newSingleThreadScheduledExecutor();//DelayedWorkQueue 队列如果满了,阻塞
    Executors.newCachedThreadPool();//SynchronousQueue 队列如果满了,抛异常
    Executors.newSingleThreadExecutor();//LinkedBlockingQueue 无限加入队列

    jdk7提供了7个阻塞队列,分别是:

    ArrayBlockingQueue:一个由数组结构组成的有界阻塞队列
    LinkedBlockingQueue:一个由链表结构组成的有界阻塞队列
    PriorityBlockingQueue:一个支持优先级排序的无界阻塞队列
    DelayQueue:一个使用优先级队列实现的无界阻塞队列
    SynchronousQueue:一个不存储元素的阻塞队列
    LinkedTransferQueue:一个由链表结构组成的无界阻塞队列
    LinkedBlockingDueue:一个 由链表结构组成的双向阻塞队列

    本文以newFixedThreadPool为例,以下是jdk源码:

    public static ExecutorService newFixedThreadPool(int nThreads) {
            return new ThreadPoolExecutor(nThreads, nThreads,
                                          0L, TimeUnit.MILLISECONDS,
                                          new LinkedBlockingQueue<Runnable>());
        }
    
    public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue) {
        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
             Executors.defaultThreadFactory(), defaultHandler);
    }

    参数说明:

    • corePoolSize:核心线程数
    • maximumPoolSize: 最大线程数
    • keepAliveTime:线程指定时间内获取不到任务,则销毁
    • unit:时间单位
    • workQueue:任务队列

    线程池工作原理图解:

     

    LinkedBlockingQueue默认的最大任务数量是Integer.MAX_VALUE,非常大,可以理解为无限大吧;但是存在这种情况,当每个线程获取到一个任务后,执行时间比较长,导致workQueue里积压的任务越来越多,机器的内存使用不停的飙升,最后也会导致OOM。

    不积跬步无以至千里不积小流无以成江海
  • 相关阅读:
    Redis订阅和发布模式和Redis事务
    Redis介绍和环境安装
    Redis基本数据类型
    MongoDB导入导出以及数据库备份
    MongoDB-python的API手记
    MongoDB对应SQL语句
    判断是否微信浏览器访问并得到微信版本号
    windows 下编译php扩展库pecl里的扩展memcache
    用PHPExcel类读取excel文件的内容
    用excel.php类库导出excel文件
  • 原文地址:https://www.cnblogs.com/zhaoyan001/p/10769717.html
Copyright © 2011-2022 走看看