【260期】Java线程池,这篇能让你和面试官聊了半小时

【260期】Java线程池,这篇能让你和面试官聊了半小时

Java工作的时候,线程池是一个必问的知识点,面试时,有的人只能讲五分钟,而有些人可以讲半个小时,差别在哪?在于知识的深度。下面几个面试高频题,你会吗?不会,赶紧收藏此博文。

  • 线程池各个参数的作用,简单阐述一下线程池工作流程。
  • 常见的线程池有哪些,分别适用于什么场景?
  • 使用无界队列的线程会导致内存飙升吗?

Java线程池概念

顾名思义,管理线程的池子,相比于手工创建、运行线程,使用线程池,有如下优点

  • 降低线程创建和销毁线程造成的开销
  • 提高响应速度。任务到达时,相对于手工创建一个线程,直接从线程池中拿线程,速度肯定快很多
  • 提高线程可管理性。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统稳定性,使用线程池可以进行统一分配、调优和监控

Java线程池创建

无论是创建何种类型线程池(FixedThreadPool、CachedThreadPool…),均会调用ThreadPoolExecutor构造函数,下面详细解读各个参数的作用

public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
        return new ScheduledThreadPoolExecutor(corePoolSize);
}
public ScheduledThreadPoolExecutor(int corePoolSize) {
    super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
          new DelayedWorkQueue());
}

线程总数阈值为Integer.MAX_VALUE,工作队列使用DelayedWorkQueue,非核心线程存活时间为0,所以线程池仅仅包含固定数目的核心线程。

两种方式提交任务:

  • scheduleAtFixedRate: 按照固定速率周期执行
  • scheduleWithFixedDelay:上个任务延迟固定时间后执行

使用场景:周期性执行任务,并且需要限制线程数量的场景

面试题:使用无界队列的线程池会导致内存飙升吗?

答案 :会的,newFixedThreadPool使用了无界的阻塞队列LinkedBlockingQueue,如果线程获取一个任务后,任务的执行时间比较长,会导致队列的任务越积越多,导致机器内存使用不停飙升, 最终导致OOM。

参考博客

  • https://blog.csdn.net/liuchangjie0112/article/details/90698401
  • https://zhuanlan.zhihu.com/p/73990200


来源:blog.csdn.net/xuan_lu/article/details/107797505

END

十期推荐

【241期】面试官:你了解JVM中的ZGC垃圾收集器吗?
【242期】面试官:Spring AOP有哪些通知类型,它们的执行顺序是怎样的?
【243期】面试官:什么是前缀索引、为什么要用前缀使用、用在什么场景下?
【244期】万字+图解 Redis,面试不用愁了!
【245期】面试官:MySQL发生死锁有哪些原因,怎么避免?
【246期】面试官:说说你对 RabbitMQ 的理解以及使用它的场景
【247期】记一次Java面试中遇到的三个问题及感悟!
【248期】面试官:你能说几个Java8中Stream对列表去重的方法吗?
【249期】关于Java中的异常,面试可以问的都在这里了!
【250期】关于Mybatis知识点,面试可以问的都在这里了!


与其在网上拼命找题? 不如马上关注我们~

【260期】Java线程池,这篇能让你和面试官聊了半小时

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/8103.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!