1.Countdown launch 怎么保证顺序性
countdown()方法 表示count值减一
await()方法 表示等待count值减到0时继续执行
CountDownLatch latch1 = new CountDownLatch(1);
CountDownLatch latch2 = new CountDownLatch(1);
// 线程 A 执行任务 1
new Thread(() -> {
System.out.println("任务 1 开始");
// 模拟任务执行
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("任务 1 完成");
latch1.countDown(); // 通知任务 1 完成
}).start();
// 线程 B 等待任务 1 完成后执行任务 2
new Thread(() -> {
try {
latch1.await(); // 等待任务 1 完成
System.out.println("任务 2 开始");
// 模拟任务执行
Thread.sleep(1000);
System.out.println("任务 2 完成");
latch2.countDown(); // 通知任务 2 完成
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
// 线程 C 等待任务 2 完成后执行任务 3
new Thread(() -> {
try {
latch2.await(); // 等待任务 2 完成
System.out.println("任务 3 开始");
// 模拟任务执行
Thread.sleep(1000);
System.out.println("任务 3 完成");
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
2.过滤器和拦截器区别
参考文档 segmentfault.com/a/119000003…
拦截器是springmvc的一部分 更接近业务层 在controller请求之前和处理完成后执行 一般用来做业务鉴权 处理日志记录 业务增强
过滤器是serverlet的一部分 先执行 在servelet请求之前和响应之后执行 一般用来进行编码处理 请求参数处理 跨域处理等
一个是dofilter 一个是handlerintercepter
3.微信登陆流程
4.token校验逻辑
5.Countdown launch 底层
计数器 + AQS
6.策略模式
7.线程池参数
8.springboot注解
Spring Boot 的注解极大简化了开发,主要分为:
核心注解(@SpringBootApplication、@ComponentScan)。
Web 开发(@RestController、@GetMapping)。
数据访问(@Entity、@Transactional)。
配置与属性(@Value、@ConfigurationProperties)。
测试(@SpringBootTest、@MockBean)。
9.启动打印服务名
10.async会造成哪些问题
11.git rebase cherrypick
12.统一异常处理
13.@Scheduled
@EnableScheduling
@Scheduled 不支持分布式锁。如需在集群中避免重复执行,需结合 Redis、ZooKeeper 等实现分布式调度(如使用 ShedLock 库)。
默认线程池的问题
问题:Spring 默认使用一个简单的单线程池(SimpleAsyncTaskExecutor),每次调用都会创建新线程,可能导致:
线程资源耗尽(高并发场景下)。
无法控制线程行为(如拒绝策略、线程命名)。
解决:自定义线程池,通过 ThreadPoolTaskExecutor 配置:@Configuration
@EnableAsync
public class AsyncConfig implements AsyncConfigurer {
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(5); // 核心线程数
executor.setMaxPoolSize(10); // 最大线程数
executor.setQueueCapacity(100); // 任务队列容量
executor.setThreadNamePrefix("Async-"); // 线程名前缀
executor.initialize();
return executor;
}
}
@async自调用失效问题
出现异常不能返回主线程
或者可以通过CompletableFuture返回@Async
public CompletableFuture<String> asyncMethodWithReturn() {
// 模拟耗时操作
Thread.sleep(1000);
return CompletableFuture.completedFuture("Result");
}
14.线程池参数
最大线程数 核心线程数 任务队列 空闲线程存活时间 拒绝策略