上海回合肥年初面试第七天😐

57 阅读2分钟

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

image.png

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.线程池参数

最大线程数 核心线程数 任务队列 空闲线程存活时间 拒绝策略

15.分布式锁如何释放

16.查看垃圾回收情况命令

17.查看日志命令