1、在启动类上加注解 @EnableAsync
2、定义线程池的类
package com.javabase.Thread; import com.google.common.util.concurrent.ThreadFactoryBuilder; import java.util.concurrent.*; public class EventThreadPool extends ThreadPoolExecutor { /** * 定义线程工厂名称 */ private static ThreadFactory HANDLEREMINDWAY_FACTORY = new ThreadFactoryBuilder() .setNameFormat("EventThreadPool-%d").build(); public EventThreadPool() { super(Runtime.getRuntime().availableProcessors(), Runtime.getRuntime().availableProcessors() * 30, 20, TimeUnit.SECONDS, new ArrayBlockingQueue<>(1000), HANDLEREMINDWAY_FACTORY,new CallerRunsPolicy()); } // public ThreadPoolExecutor getThreadPoolExecutor() { // return new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors(), Runtime.getRuntime().availableProcessors() * 30, // 20, TimeUnit.SECONDS, new ArrayBlockingQueue<>(1000)); // } public EventThreadPool(int corePoolSize, int maximumPoolSize, long keepAliveTime) { /** * * (ArrayBlockingQueue读写只有一个锁(效率更高),LinkedBlockingQueue读写锁分离) * LinkedBlockingQueue即无界队列. * 将ArrayBlockingQueue即无界队列的大小设置为1000. * 使用无界队列 * 将LinkedBlockingQueue即无界队列的大小设置为500. * 将导致在所有 corePoolSize线程都忙的情况下将新任务加入队列, * 这样,创建的线程就不会超过 corePoolSize, 而且当排队的任务超过500时,将拒绝执行 */ super(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(1000), Executors .defaultThreadFactory()); } }
3、注入工厂到spring中
package com.javabase.Thread; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.concurrent.ThreadPoolExecutor; @Configuration public class ThreadPoolConfig { @Bean("RewardThreadPool") public ThreadPoolExecutor rewardThreadPool() { return new EventThreadPool(); } @Bean("reportThreadPool") public ThreadPoolExecutor reportThreadPool() { return new EventThreadPool(); } @Bean("roomReservationThreadPool") public ThreadPoolExecutor roomReservationThreadPool() { return new EventThreadPool(); } }
4、在自己的方法中使用
package com.javabase.Thread; 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; /** * 构建执行定时任务 * TODO */ @Component @EnableScheduling public class ScheduledTask3 { private Logger logger = LoggerFactory.getLogger(ScheduledTask3.class); private int fixedDelayCount = 1; private int fixedRateCount = 1; private int initialDelayCount = 1; private int cronCount = 1; /* @Scheduled(fixedDelay = 5000) //fixedDelay = 5000表示当前方法执行完毕5000ms后,Spring scheduling会再次调用该方法 public void testFixDelay() { logger.info("===fixedDelay: 第{}次执行方法", fixedDelayCount++); } @Scheduled(fixedRate = 5000) //fixedRate = 5000表示当前方法开始执行5000ms后,Spring scheduling会再次调用该方法 public void testFixedRate() { logger.info("===fixedRate: 第{}次执行方法", fixedRateCount++); } @Scheduled(initialDelay = 1000, fixedRate = 5000) //initialDelay = 1000表示延迟1000ms执行第一次任务 public void testInitialDelay() { logger.info("===initialDelay: 第{}次执行方法", initialDelayCount++); }*/ /*@Scheduled(cron = "0 0/1 * * * ?") //cron接受cron表达式,根据cron表达式确定定时规则 public void testconfigureTasks() { logger.info("===initialDelay: 第{}次执行方法", cronCount++); }*/ @Async("RewardThreadPool") @Scheduled(cron = "0/1 * * * * ?") public void testtaskExecutor() { logger.info("ScheduledTask3定时任务开始 :{} " + "\r\n线程 : {}", LocalDateTime.now().toLocalTime(), Thread.currentThread().getName()); logger.info("===initialDelay: 第{}次执行方法", cronCount++); } }