import com.google.common.util.concurrent.ThreadFactoryBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableAsync; import java.util.concurrent.*; @Configuration @EnableAsync public class AsyncConfig2 { //获取cpu数,但是好像不准 private static final int NTHREADS = Runtime.getRuntime().availableProcessors(); private static ThreadFactory SENDE_FACTORY = new ThreadFactoryBuilder() .setNameFormat("send-pool-%d").build(); @Bean public Executor taskExecutor() { ExecutorService sendEmailForM3MerchanthreadPool = new ThreadPoolExecutor(NTHREADS * 2, NTHREADS * 2, 100, TimeUnit.SECONDS, new ArrayBlockingQueue<>(1000),SEND_FACTORY ); return sendMerchanthreadPool; } }
或者
@Configuration @EnableAsync public class AsyncConfig implements SchedulingConfigurer { /** * 获取cpu数 */ private static final int NTHREADS = Runtime.getRuntime().availableProcessors(); /** * 定义线程工厂名称 */ private static ThreadFactory HANDLEREMINDWAY_FACTORY = new ThreadFactoryBuilder() .setNameFormat("handleRemindWay-pool-%d").build(); @Override public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) { scheduledTaskRegistrar.setScheduler(Executors.newScheduledThreadPool(NTHREADS * 2, HANDLEREMINDWAY_FACTORY)); } }
1、定义定时任务,添加@EnableAsync开启对异步的支持
2、在springboot启动类加上注解
@EnableScheduling
3、在使用的地方定义
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.time.LocalDateTime; @Component @EnableScheduling public class Send { private final static Logger log = LoggerFactory.getLogger(Send.class); @Async @Scheduled(cron = "0/1 * * * * ?") public void doBiz() { log.info("定时任务开始 :{} " + "\r\n线程 : {}", LocalDateTime.now().toLocalTime(), Thread.currentThread().getName()); } }
指定多个线程池的方式:
或者配置多个线程池
@Configuration @EnableAsync public class ExecutorConfig1 { @Bean public Executor executor1() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setThreadNamePrefix("test-schedule1-"); executor.setMaxPoolSize(20); executor.setCorePoolSize(15); executor.setQueueCapacity(0); executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); return executor; } @Bean public Executor executor2() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setThreadNamePrefix("test-schedule2-"); executor.setMaxPoolSize(20); executor.setCorePoolSize(15); executor.setQueueCapacity(0); executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); return executor; } }
使用
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.time.LocalDateTime; @Component @EnableScheduling public class Send { private final static Logger log = LoggerFactory.getLogger(Send.class); @Async("executor2") @Scheduled(cron = "0/1 * * * * ?") public void doBiz() { log.info("定时任务开始 :{} " + "\r\n线程 : {}", LocalDateTime.now().toLocalTime(), Thread.currentThread().getName()); } }