创建线程池的实例应用
package com.youming.shuiku.datacenter.provider.utils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.ThreadPoolExecutor;
@Slf4j
public class AsyncManager {
//线程处理类
private static ThreadPoolTaskExecutor threadPoolTaskExecutor;
//本类
private static AsyncManager asyncManager;
//该无参构造方法用于或得在容器中得线程处理类
private AsyncManager(){
//获得在容器中的线程处理类
threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
threadPoolTaskExecutor.setCorePoolSize(12);//核心线程大小
threadPoolTaskExecutor.setMaxPoolSize(48 * 2);//最大线程大小
threadPoolTaskExecutor.setQueueCapacity(500);//队列最大容量
threadPoolTaskExecutor.setKeepAliveSeconds(300);
//当提交的任务个数大于QueueCapacity,就需要设置该参数,但spring提供的都不太满足业务场景,可以自定义一个,也可以注意不要超过QueueCapacity即可
threadPoolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
threadPoolTaskExecutor.setWaitForTasksToCompleteOnShutdown(true);
threadPoolTaskExecutor.setAwaitTerminationSeconds(60);
threadPoolTaskExecutor.setThreadNamePrefix("TaskLogo-Thread-");
threadPoolTaskExecutor.initialize();
//查看线程的数量
if(threadPoolTaskExecutor.getCorePoolSize()!=12){
log.info("getMaxPoolSize==="+threadPoolTaskExecutor.getCorePoolSize());
}
}
//该方法用于创建AsyncManager类 就是本类
public static AsyncManager getInstance(){
//判断本类是不是空 如果是空的话就创建一个 返回 如果不是空就直接放回
if (asyncManager == null){
synchronized (AsyncManager.class){
if(asyncManager == null){
asyncManager = new AsyncManager();
return asyncManager;
}
}
}
return asyncManager;
}
//该方法用于把任务提交
public void execute(Runnable runnable){
//execute线程的无返回值提交方法
threadPoolTaskExecutor.execute(runnable);
}
}
使用:
AsyncManager.getInstance().execute(asyncFactory.getDingTalkToken());
public Runnable getDingTalkToken() {
Runnable runnable = () -> {
List<DingTalkConfig> list = dingTalkConfigService.list();
for (DingTalkConfig dingTalkConfig : list) {
String token = acquireDingTalkToken(dingTalkConfig.getCorpId(), dingTalkConfig.getAppSecret());
redisTemplate.opsForValue().set(dingTalkConfig.getRedisKey(), token, 2, TimeUnit.HOURS);
}
};
return runnable;
}
使用@Async注解实现多线程
@EnableAsync 是用于在Spring框架中启用异步方法执行的注解。它允许你在方法上使用 @Async 注解,从而实现方法的异步执行。异步方法执行意味着当你调用这些方法时,它们会在一个独立的线程中执行,而不会阻塞主调用线程。
默认情况下,Spring中的方法是同步执行的,即方法调用会等待方法的执行完成后再继续。但有时候,某些方法可能需要执行一些耗时的操作,如果在主线程中执行,可能会导致响应时间过长或影响系统的吞吐量。这时,你可以使用 @Async 注解并结合 @EnableAsync 启用异步执行,从而将这些耗时操作放在独立的线程中执行,提高系统的性能和响应性。
需要注意的是,为了使 @EnableAsync 注解生效,还需要配置一个 Executor(执行器),它负责管理异步方法的线程池。如果没有自定义配置,Spring会使用默认的线程池来执行异步方法。你可以通过在配置类上实现 AsyncConfigurer 接口或使用 @EnableAsync 的 executor 属性来自定义线程池的行为。
使用:
package com.youming.shuiku.datacenter.provider.config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.ThreadPoolExecutor;
/**
* @ fileName:ThreadPoolConfig
* @ description:
* @ author:wxh
* @ createTime:2022/8/13 15:51
* @
* version:1.0.0
*/
@Configuration
@EnableAsync
@Slf4j
public class ThreadPoolConfig {
@Bean("asyncServiceExecutor")
public ThreadPoolTaskExecutor asyncServiceExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
// 核心线程数
executor.setCorePoolSize(4);
// 最大线程数
executor.setMaxPoolSize(8);
// 线程池的队列大小
executor.setQueueCapacity(1000);
// 线程名称前缀
executor.setThreadNamePrefix("async-service-");
// 当线程池饱和拒绝策略
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
// 初始化
executor.initialize();
return executor;
}
}
使用的时候在方法加上对应的bean名称
注意:需要配置类加上@EnableAsync
注解才会开启多线程的执行。