主题
亚信科技 已完结
日期
2024 年 9 月 4 日
Java 基础
static final 类型变量存放位置
static 静态变量存储在方法区
JUC
如何创建多线程
- 继承 Thread 类,重写 run() 方法
- 实现 Runnable 接口,重写 run() 方法
- 实现 Callable 接口,重写 call() 方法
线程池的使用
Java 自带的线程池
- 创建线程池对象
ExecutorService
,指定线程池大小 - 调用
execute(Runnable cmd)
方法提交任务执行 - 使用
shutdown()
方法,等待所有提交的任务执行完毕后来关闭线程池
java
// 创建一个固定大小的线程池,大小为3
ExecutorService executorService = Executors.newFixedThreadPool(3);
// 提交任务给线程池
for (int i = 0; i < 10; i++) {
int taskNumber = i;
executorService.execute(() -> {
System.out.println(taskNumber + "-" + Thread.currentThread().getName());
try {
Thread.sleep(2000); // 模拟任务执行时间
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
// 关闭线程池
executorService.shutdown();
Spring Boot 线程池
- 定义并配置
ThreadPoolTaskExecutor
的 Spring Bean - 使用
@Async
注解标记异步方法,并注入线程池 Bean 对象 - 在 Spring Boot 启动类配置
@EnableAsync
java
@Configuration
public class TaskExecutorConfig {
@Bean(name = "taskExecutor")
public Executor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(5);
executor.setMaxPoolSize(10);
executor.setQueueCapacity(25);
executor.setThreadNamePrefix("MyExecutor-");
executor.initialize();
return executor;
}
}
@Service
public class AsyncService {
@Async("taskExecutor")
public void executeAsyncTask(int i) {
System.out.println("Executing task " + i + " - " + Thread.currentThread().getName());
try {
Thread.sleep(2000); // 模拟任务执行时间
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
@SpringBootApplication
@EnableAsync
public class ThreadPoolTaskExecutorDemoApplication {
public static void main(String[] args) {
SpringApplication.run(ThreadPoolTaskExecutorDemoApplication.class, args);
}
}
Spring Cloud
Spring Cloud 如何实现熔断降级
可以使用 Sentinel 实现熔断、限流和降级
在方法上使用 @SentinelResource
注解来启用熔断和降级功能,并指定 fallback 方法(熔断的处理方法)
Sentinel 提供了一个控制台,可以用来实时监控和管理流量控制规则。
Nacos 注册流程
- 服务启动并准备注册信息。
- 服务通过 Nacos 的 SDK 发起注册请求。
- Nacos 请求并存储服务实例信息。
- Nacos 对服务实例进行健康检查。
- 其他服务可以通过 Nacos 获取可用实例列表。
- 服务实例下线时,发起注销请求通知 Nacos。
MySQL
MySQL 的索引类型
- 主键索引
- 唯一索引
- 普通索引
- 联合索引
- 前缀索引
MySQL 的常见约束
- 非空约束:
not null
- 唯一约束:
unique
- 默认值约束:
default 0
- 主键约束:
primary key
- 外键约束:
forign key(uid)
- 检查约束:
check(gender in ('W','M'))
Redis
缓存击穿是什么?怎么解决?
缓存击穿:缓存中某个热点 key 过期了,造成大量请求直接访问数据库。
解决方法:
- 使用锁:只让一个线程去查询数据库并重建缓存。
- 添加多级缓存:使用 Caffeine、OpenResty。
- 热点 Key 设置为永不过期。