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++);
}
}