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.