Skip to content

亚信科技 已完结

日期

2024 年 9 月 4 日

Java 基础

static final 类型变量存放位置

static 静态变量存储在方法区

JUC

如何创建多线程

  1. 继承 Thread 类,重写 run() 方法
  2. 实现 Runnable 接口,重写 run() 方法
  3. 实现 Callable 接口,重写 call() 方法

线程池的使用

Java 自带的线程池

  1. 创建线程池对象 ExecutorService,指定线程池大小
  2. 调用 execute(Runnable cmd) 方法提交任务执行
  3. 使用 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 线程池

  1. 定义并配置 ThreadPoolTaskExecutor 的 Spring Bean
  2. 使用 @Async 注解标记异步方法,并注入线程池 Bean 对象
  3. 在 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 注册流程

  1. 服务启动并准备注册信息。
  2. 服务通过 Nacos 的 SDK 发起注册请求。
  3. Nacos 请求并存储服务实例信息。
  4. Nacos 对服务实例进行健康检查。
  5. 其他服务可以通过 Nacos 获取可用实例列表。
  6. 服务实例下线时,发起注销请求通知 Nacos。

MySQL

MySQL 的索引类型

  1. 主键索引
  2. 唯一索引
  3. 普通索引
  4. 联合索引
  5. 前缀索引

MySQL 的常见约束

  1. 非空约束:not null
  2. 唯一约束:unique
  3. 默认值约束:default 0
  4. 主键约束:primary key
  5. 外键约束:forign key(uid)
  6. 检查约束:check(gender in ('W','M'))

Redis

缓存击穿是什么?怎么解决?

缓存击穿:缓存中某个热点 key 过期了,造成大量请求直接访问数据库。

解决方法:

  1. 使用锁:只让一个线程去查询数据库并重建缓存。
  2. 添加多级缓存:使用 Caffeine、OpenResty。
  3. 热点 Key 设置为永不过期。

Released under the MIT License.