首页 > 其他分享 >面试小札:线程池

面试小札:线程池

时间:2024-12-08 22:30:32浏览次数:8  
标签:小札 队列 核心 面试 任务 线程 创建 空闲

 

1 什么是线程池

2 线程池如何工作的?

3 线程和进程有什么区别?

4 描述线程池的工作流程。

5 线程池的拒绝策略有哪些?

6 threadpool executor核心参数有哪些?

 

一、什么是线程池

 

线程池是一种多线程处理形式,它可以有效地管理和复用线程,避免频繁地创建和销毁线程所带来的性能开销。

 

二、线程池如何工作

 

线程池创建:首先创建一个线程池,指定一些参数,如核心线程数、最大线程数、线程空闲时间等。

任务提交:当有新的任务提交到线程池时,如果线程池中的线程数小于核心线程数,会创建新的线程来执行任务。

线程复用:如果线程数已经达到核心线程数,新的任务会被放入任务队列等待线程空闲时执行。

线程扩充:当任务队列已满,且线程数小于最大线程数,会创建新的线程来执行任务。

线程回收:当线程空闲时间超过指定的时间,且线程数大于核心线程数,多余的线程会被回收。

 

三、线程和进程的区别

 

资源分配:进程拥有独立的地址空间和资源,而线程共享所属进程的资源。

调度:进程切换开销较大,线程切换开销较小。

通信:进程间通信较为复杂,线程间通信相对简单。

健壮性:一个进程崩溃一般不会影响其他进程,而一个线程崩溃可能导致整个进程崩溃。

 

四、线程池的工作流程

 

创建线程池:通过指定核心线程数、最大线程数、工作队列等参数来创建线程池。

提交任务:调用线程池的 execute 或 submit 方法提交任务。

分配线程执行任务:如果有空闲线程,直接分配执行任务;如果没有空闲线程且线程数小于核心线程数,创建新线程执行;如果线程数达到核心线程数,任务放入工作队列等待。

处理工作队列中的任务:当有线程空闲时,从工作队列中获取任务执行。

扩展线程:如果工作队列已满且线程数小于最大线程数,创建新线程执行任务。

回收线程:当线程空闲时间超过设定值且线程数大于核心线程数,回收多余线程。

 

五、线程池的拒绝策略

 

 AbortPolicy :直接抛出 RejectedExecutionException 异常,阻止系统正常运行。

 CallerRunsPolicy :将任务回退到调用者所在线程执行。

 DiscardOldestPolicy :丢弃队列中最旧的未处理任务,然后重新尝试执行当前任务。

 DiscardPolicy :直接丢弃任务,不做任何处理。

 

六、 ThreadPoolExecutor 核心参数

 

 corePoolSize :核心线程数,即使线程空闲也会保留的线程数。

 maximumPoolSize :最大线程数。

 keepAliveTime :线程空闲时间,超过该时间空闲线程会被回收。

 unit : keepAliveTime 的时间单位。

 workQueue :用于保存等待执行任务的阻塞队列。

标签:小札,队列,核心,面试,任务,线程,创建,空闲
From: https://blog.csdn.net/m0_60235638/article/details/144231651

相关文章

  • 【鸿蒙开发】ArkTS --“必备”面试题
    系列文章目录【鸿蒙开发】ArkTS--“必备”面试题【鸿蒙开发】ArkTS--“必备”面试题文章目录系列文章目录前言一、什么是类型断言?二、装饰器介绍前言一、什么是类型断言?类型断言允许程序员手动指定一个值的类型。这在需要明确告诉编译器某个值的类型时非常有......
  • 彻底理解线程池的使用与原理
    一.前言1.实际工作中使用线程资源的情况是很多的,为什么推荐使用线程池完成线程的创建?(1)线程池的好处是减少在创建和销毁线程上所消耗的时间以及系统资源的开销,解决资源不足的问题;(2)如果不使用线程池,有可能造成系统创建大量同类线程而导致消耗完内存或者“过度切换”的问......
  • 史上最强Java八股文面试题,堪称2025最强!!!
    1、什么是java序列化,如何实现java序列化   难度系数:⭐序列化是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。序列化......
  • JAVA面试题大全(200+道题目)
    一、Java基础1.JDK和JRE有什么区别?jdk:javadevelopmentkitjre:javaruntimeEnvironmentjdk是面向开发人员的,是开发工具包,包括开发人员需要用到的一些类。jre是java运行时环境,包括java虚拟机等,是提供给使用java的人用的2.==和equals的区别是什么?==比较的是两......
  • 线程与进程的区别和应用场景,以及各种锁的使用
    目录一:线程1:定义2:多线程的优点3:线程切换到底是切换的什么4:什么时候使用多线程5:多线程中锁的使用(线程同步)二:进程1:定义2:多进程的优点3:多进程的应用场景4:进程间通信的方式三:线程和进程哪个好?我先讲一下进程:那还需要线程干嘛?所以我们不能一味的只追求哪个好,而是分......
  • 前端热门面试题目(四五六七)
    1.使用import时,Webpack如何处理node_modules中的依赖?依赖解析:Webpack遇到import时,利用resolve配置查找依赖。如果是第三方依赖(node_modules),Webpack会优先查找其主入口(package.json中的main或module字段)。模块打包:ESM模块:支持TreeShaking,按需打包......
  • K8s面试系列:K8s常用 API 资源总结速记
    写在前面博文内容为K8s中常用的API资源简单总结适合对K8s有基本认知,温习,面试准备的小伙伴内容涉及:API资源组成,SSA和CSA资源操作方式,以及下面资源类别简单描述工作负载:Deployments,StatefulSets,HorizontalPodAutoscaler(HPA)…服务:Service,Ingress,E......
  • 【并发编程】第三章 在线程之间共享数据
    3.1线程间共享数据的问题如果所有共享数据都是只读的,则不会有问题,因为一个线程读取的数据不受另一个线程的影响不变量(invariants):在程序或数据结构的特定状态下始终为真的属性或条件无论代码如何执行,这个不变量都应该始终保持成立。如果不成立,那就可能出现了错误考虑一个......
  • 高级java每日一道面试题-2024年12月08日-JVM篇-什么是类加载器?
    如果有遗漏,评论区告诉我进行补充面试官:什么是类加载器?我回答:在Java高级面试中,类加载器(ClassLoader)是一个重要的概念,它涉及到Java类的加载和初始化机制。以下是对类加载器的详细解释:定义与作用类加载器是Java虚拟机(JVM)提供的一种机制,用于将Java类的字节码(.class文......
  • 高级java每日一道面试题-2024年12月07日-JVM篇-如何选择垃圾收集器?
    如果有遗漏,评论区告诉我进行补充面试官:如何选择垃圾收集器?我回答:在Java高级面试中,选择垃圾收集器(GarbageCollector,GC)是一个重要且常见的议题。选择合适的垃圾收集器对于优化应用程序的性能至关重要。以下是对如何选择垃圾收集器的详细解析:了解垃圾收集器的基本类......