目录
[🔥 问题6:线程返回值获取三大方案](#🔥 问题6:线程返回值获取三大方案)
[🔥 问题7:线程状态机全解析](#🔥 问题7:线程状态机全解析)
[🔥 问题8:sleep()与wait()的六大维度对比](#🔥 问题8:sleep()与wait()的六大维度对比)
[二、Spring IOC容器深度剖析](#二、Spring IOC容器深度剖析)
[🌟 IOC容器核心概念](#🌟 IOC容器核心概念)
[传统开发 vs IOC对比](#传统开发 vs IOC对比)
[🌟 Spring IOC核心机制](#🌟 Spring IOC核心机制)
[1. Spring IOC容器的启动过程?](#1. Spring IOC容器的启动过程?)
[2. BeanFactory与ApplicationContext区别进阶](#2. BeanFactory与ApplicationContext区别进阶)
[3. Spring如何解决循环依赖?](#3. Spring如何解决循环依赖?)
一、Java多线程高阶应用
🔥 问题6:线程返回值获取三大方案
方案对比与实现

方案 | 实现代码 | 优势 | 劣势 |
---|---|---|---|
主线程等待法 | thread.join() |
简单易用 | 无法异步获取结果 |
FutureTask | FutureTask<Integer> task = new FutureTask<>(callable) |
灵活可控 | 需手动管理线程 |
线程池Future | Future<Integer> future = executor.submit(callable) |
资源管理高效 | 需要线程池基础设施 |
线程池最佳实践
java
public class ResultDemo {
public static void main(String[] args) throws Exception {
ExecutorService pool = Executors.newFixedThreadPool(3);
Future<Integer> future = pool.submit(() -> {
TimeUnit.SECONDS.sleep(2);
return 42;
});
// 异步获取结果
System.out.println("计算结果:" + future.get());
pool.shutdown();
}
}
🔥 问题7:线程状态机全解析
线程生命周期状态图

关键状态说明
-
BLOCKED:等待进入synchronized代码块
-
WAITING:无限期等待其他线程显式唤醒
-
TIMED_WAITING:具有时间限制的等待状态
-
TERMINATED:线程执行完毕后不可重启
🔥 问题8:sleep()与wait()的六大维度对比
对比维度 | sleep() | wait() |
---|---|---|
方法归属 | Thread类静态方法 | Object类实例方法 |
锁释放 | 不释放任何锁 | 释放对象锁 |
使用条件 | 任意场景 | 必须在同步代码块内 |
唤醒方式 | 超时自动唤醒 | 需要notify()/notifyAll() |
精度控制 | 毫秒级 | 纳秒级(重载方法) |
异常处理 | 需捕获InterruptedException | 需捕获InterruptedException |
代码验证示例
java
public class SleepWaitDemo {
private static final Object lock = new Object();
public static void main(String[] args) {
new Thread(() -> {
synchronized (lock) {
try {
System.out.println("Thread1进入等待");
lock.wait(2000); // 释放锁
System.out.println("Thread1被唤醒");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
new Thread(() -> {
synchronized (lock) {
try {
System.out.println("Thread2获得锁");
Thread.sleep(3000); // 不释放锁
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
}
二、Spring IOC容器深度剖析
🌟 IOC容器核心概念
传统开发 vs IOC对比

维度 | 传统开发 | IOC控制反转 |
---|---|---|
对象创建 | 开发者显式new创建 | 容器自动创建管理 |
依赖管理 | 硬编码依赖关系 | 容器自动注入依赖 |
配置方式 | 代码耦合 | 配置与代码分离 |
可测试性 | 难以Mock依赖 | 轻松替换实现类 |
🌟 Spring IOC核心机制
IOC容器架构图

IOC核心功能清单
-
依赖注入:构造器注入/Setter注入/字段注入
-
生命周期管理:初始化回调/销毁回调
-
作用域控制:Singleton/Prototype/Request等
-
资源抽象:统一资源访问接口
-
国际化支持:MessageSource消息解析
-
事件传播:ApplicationEvent发布/监听
三、高频面试题强化训练
1. Spring IOC容器的启动过程?
-
资源定位:扫描配置元数据(XML/注解)
-
Bean定义加载:解析为BeanDefinition
-
注册Bean定义:存入BeanDefinitionRegistry
-
Bean实例化:根据作用域创建Bean实例
-
依赖注入:自动装配Bean的依赖项
-
初始化回调:执行@PostConstruct等方法
-
可用状态:ApplicationContext完成刷新
2. BeanFactory与ApplicationContext区别进阶
功能扩展 | BeanFactory | ApplicationContext |
---|---|---|
AOP集成 | 手动配置 | 自动代理生成 |
注解支持 | 需手动启用 | 默认支持@ComponentScan等 |
环境抽象 | 基础支持 | 完整Profile支持 |
资源加载 | 简单资源加载 | 支持模式匹配资源路径 |
类型转换 | 基本转换 | 强大的ConversionService |
3. Spring如何解决循环依赖?

实战建议:
-
使用
@Lazy
注解延迟初始化解决复杂依赖问题 -
通过
@DependsOn
控制Bean初始化顺序 -
自定义BeanPostProcessor实现扩展逻辑
互动问答:
💬 你在项目中遇到过哪些棘手的依赖注入问题?如何解决的?