<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
其中已经包含了线程池需要用的的包,所以无需再引用,只需要配置就行
第一步:编写配置类
@Configuration @EnableAsync//开启异步任务的支持 public class TaskPoolConfig{ @Bean public TaskExecutor taskExecutor() { ThreadPoolTaskExecutor poolTaskExecutor = new ThreadPoolTaskExecutor(); poolTaskExecutor.setCorePoolSize(4); poolTaskExecutor.setMaxPoolSize(6); // 设置线程活跃时间(秒) poolTaskExecutor.setKeepAliveSeconds(120); // 设置队列容量 poolTaskExecutor.setQueueCapacity(40); // 设置拒绝策略 //AbortPolicy策略:该策略会直接抛出异常,阻止系统正常工作。 // //CallerRunsPolicy 策略:只要线程池未关闭,该策略直接在调用者线程中,运行当前的被丢弃的任务。 // //DiscardOleddestPolicy策略: 该策略将丢弃最老的一个请求,也就是即将被执行的任务,并尝试再次提交当前任务。 // //DiscardPolicy策略:该策略默默的丢弃无法处理的任务,不予任何处理。 poolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); // 等待所有任务结束后再关闭线程池 poolTaskExecutor.setWaitForTasksToCompleteOnShutdown(true); return poolTaskExecutor; } }
注意:@Configuration @EnableAsync//开启异步任务的支持,这两个注解必须有,第一个注解的意思是把此类加载为配置,系统启动的时候就去加载,第二个注解的意思是开启异步任务,这个注解开启之后才会起作用。
第二步:注入配置类,编写测试,在方法上加 @Async就会启用多线程异步任务。实现runable方法没有返回值,如需要返回值则结合future 使用。
@Component @Slf4j public class PoolTask { @Autowired private TaskExecutor taskExecutor; @Async @Bean //项目加载的时候执行 public void sayHello() { taskExecutor.execute(new Stats("线程1")); taskExecutor.execute(new Stats("线程2")); taskExecutor.execute(new Stats("线程3")); taskExecutor.execute(new Stats("线程4")); taskExecutor.execute(new Stats("线程5")); } static class Stats implements Runnable{ String threadName; public Stats(String threadName) { this.threadName = threadName; } @Override public void run() { log.info(threadName+"开始执行"); try { Thread.sleep(1000); log.info(threadName+"结束执行"); } catch (InterruptedException e) { e.printStackTrace(); } } } }