【无标题】

Java面试高频:AOC、AOP+ 线程池

一、面试口述极简版(直接背,30秒答完)

  1. AOC、AOP 口述答案
    AOP是面向切面编程,是一种编程思想。核心就是把项目中通用的横切逻辑,比如日志、事务、权限校验、接口限流这些和业务无关、但所有方法都可能用到的代码抽离出来,形成独立的切面。在不修改原有业务代码的前提下,动态织入到目标方法的前后、异常或者全程执行,实现业务代码和通用功能解耦,提升代码复用性和可维护性。
    AOC是面向切面配置,是AOP的落地实现方式。简单说AOP是理论思想,AOC是通过注解、配置类等配置手段,快速定义切面、切点和通知规则,不用硬编码实现切面功能,是Spring中AOP的具体配置落地方式。
    AOP底层主要依靠两种代理实现:JDK动态代理,基于接口实现;CGLIB代理,基于类继承实现。
  2. 线程池核心参数 & 排队过程 口述答案
    线程池一共有七个核心参数,分别是核心线程数、最大线程数、空闲线程存活时间、时间单位、阻塞队列、线程工厂和拒绝策略。
    任务的执行和排队流程是固定的:首先提交任务时,如果当前运行线程数小于核心线程数,直接新建核心线程执行任务;如果核心线程已满,新任务就进入阻塞队列排队;当队列也存满之后,会新建非核心线程处理任务,直到总线程数达到最大线程数;如果最大线程数也打满、队列也已满,就会触发拒绝策略。另外,非核心线程空闲超过指定时间会被回收,只保留核心线程常驻。
    任务在队列中主要有三种状态:队列未满时排队等待、被线程取出执行、队列和线程池均满时被拒绝。

二、CSDN正式博客版(可直接复制发布)

Java面试高频考点:AOC与AOP区别、线程池核心参数及任务排队全流程

标签:#Java面试 #SpringAOP #线程池 #并发编程 #面试真题

简介:本文梳理两道Java后端高频面试真题,包含AOP与AOC的核心概念、区别与底层原理,同时详解线程池七大核心参数、任务队列状态及完整排队执行流程,内容贴合面试场景,通俗易懂,可直接用于面试应答和技术复盘。

  1. AOP、AOC 核心知识点详解
    1.1 什么是AOP(面向切面编程)
    AOP全称 Aspect Oriented Programming 面向切面编程,是Spring核心编程思想之一,是对OOP面向对象编程的补充。
    OOP侧重对业务对象的模块化封装,而AOP专门处理横切逻辑。所谓横切逻辑,就是项目中多处复用、与核心业务无关的通用代码,例如:统一日志打印、事务控制、权限校验、接口监控、限流熔断等。
    AOP核心作用:在不修改原有业务代码的前提下,对目标方法进行增强,实现业务逻辑与通用公共逻辑解耦,让业务代码更纯净、简洁。
    AOP核心五大术语
  • 切面(Aspect):封装横切逻辑的类,也就是我们自定义的日志、事务等功能类
  • 连接点(JoinPoint):程序中可以被增强的任意位置,通常指所有目标方法
  • 切点(PointCut):匹配规则,用于筛选需要被增强的目标方法
  • 通知(Advice):具体的增强逻辑,分为前置、后置、环绕、异常、最终通知
  • 织入(Weaving):将切面动态嵌入目标方法的过程
    AOP底层实现原理
  • JDK动态代理:基于接口实现,目标类必须实现接口
  • CGLIB代理:基于类继承实现,无需接口,通过继承目标类生成子类完成代理
    1.2 什么是AOC(面向切面配置)
    AOC全称 Aspect Oriented Configuration 面向切面配置,它不是编程思想,而是AOP思想的落地实现方式。
    简单来说:AOP是抽象的编程理念,AOC是具体的配置手段。我们通过Spring的注解(@Aspect、@Before等)或XML配置,快速定义切面、切点和通知规则,无需手动编写代理代码,简化AOP的开发流程。
    1.3 AOP与AOC核心区别总结
  • AOP:编程思想、设计理念,解决代码解耦、横切逻辑复用问题
  • AOC:配置实现方式,是落地AOP思想的具体手段

  1. 线程池核心参数、队列状态及任务排队全流程
    线程池是Java并发编程核心考点,面试重点考察七大核心参数、任务排队执行流程、队列任务状态和拒绝策略。
    2.1 线程池七大核心参数
    ThreadPoolExecutor 完整构造参数共7个,缺一不可:
  2. corePoolSize(核心线程数):线程池常驻线程,即使空闲也不会被回收,是线程池的基础工作线程
  3. maximumPoolSize(最大线程数):线程池能创建的最大线程数量,核心线程数之外的线程为非核心线程
  4. keepAliveTime(空闲存活时间):非核心线程的空闲超时时间,超时未处理任务会被自动回收
  5. unit(时间单位):配合存活时间的时间单位,如秒、毫秒、分钟
  6. workQueue(阻塞队列):用于存储等待执行的任务,常用有ArrayBlockingQueue、LinkedBlockingQueue等
  7. threadFactory(线程工厂):负责创建线程,可自定义线程名称、优先级等
  8. handler(拒绝策略):任务爆满时的拒绝处理策略,适配不同业务场景
    2.2 任务在队列中的三种状态
    所有提交的任务,在线程池中的状态流转只有三种:
  9. 排队等待:核心线程已满,任务进入阻塞队列,排队等待线程空闲后执行
  10. 执行中:线程从队列中取出任务,移出队列并开始执行
  11. 被拒绝:队列已满 + 线程数达到最大值,新任务触发拒绝策略,直接拒绝处理
    2.3 任务完整排队 & 执行流程(面试核心)
    线程池的任务处理遵循核心线程 → 队列 → 最大线程 → 拒绝策略的优先级顺序,具体流程如下:
  12. 创建核心线程执行:新任务提交,若当前工作线程数 < 核心线程数,直接新建核心线程执行任务
  13. 队列排队等待:当前工作线程数 ≥ 核心线程数,新任务不再新建线程,直接进入阻塞队列排队
  14. 创建非核心线程:阻塞队列已满,无法存入新任务,此时新建非核心线程处理任务,直至总线程数达到最大线程数
  15. 触发拒绝策略:总线程数达到最大值、队列也完全爆满,新提交任务触发拒绝策略
  16. 空闲线程回收:任务执行完毕后,非核心线程处于空闲状态,超过指定存活时间后被回收,线程池最终保留核心线程常驻,节省系统资源
    2.4 四种常见拒绝策略
  • AbortPolicy(默认):直接抛出异常,终止任务提交
  • CallerRunsPolicy:由提交任务的主线程自行执行任务
  • DiscardPolicy:直接丢弃新任务,不抛异常、无任何提示
  • DiscardOldestPolicy:丢弃队列中最旧的未执行任务,替换为新任务
    总结
  1. AOP是解耦横切逻辑的编程思想,AOC是AOP的配置落地方式,是Spring事务、日志监控等功能的核心基础;
  2. 线程池核心流程遵循先核心、再队列、后扩容、最后拒绝的规则,掌握参数和排队流程,是Java并发面试的必考核心。
相关推荐
一棵白菜6 小时前
java 学习
java
卷毛的技术笔记6 小时前
Java后端硬核实战:用Spring AI Alibaba+Redis给LLM装上“超强记忆中枢”
java·人工智能·redis·后端·spring·ai·系统架构
nnsix7 小时前
C# 字符串 根据换行符分割
开发语言·c#
Vallelonga7 小时前
Rust Conversion 工具 trait AsRef AsMut
开发语言·rust
Vallelonga7 小时前
Rust 中的“解引用”和智能指针与 MutexGuard 等
开发语言·rust
小鱼仙官7 小时前
Windonws 视频存储,10s/不限时
开发语言·qt·音视频
csbysj20207 小时前
框架:构建高效解决方案的基石
开发语言
轻颂呀7 小时前
C++11——并发库介绍
开发语言·c++
AKA__Zas8 小时前
初识多线程(3.0)
java·开发语言·学习方法